socket(套接字)實質上提供了程序通訊的端點,程序通訊之前,雙方首先必須各自有乙個端點。通過socket將ip位址和埠繫結之後,客戶點就可以和伺服器通訊了。
#include 「sys/socket.h」
int socket(int domain, int type, int protocol);
socket sockaddr_in
typedef struct in_addr
s_un_b;
structs_un_w;
unsigned long s_addr; //ipv4 設定為32位
}s_un;
不同型別的cpu對變數的位元組儲存順序可能不同;而網路傳輸的資料一定是要統一的。所以當內部位元組儲存順序和網路位元組序不同時,要進行轉換。網路序都是大端位元組序。bind繫結伺服器的位址和埠到socket,這樣做就是讓客戶端來發現用以連線的伺服器的位址
int bind(int sockfd, const struct sockaddr *addr, socklent_t len);
返回值:成功返回0 失敗返回-1
引數:sockfd: 伺服器socket
addr :伺服器的位址,
len: addr的長度
listen
伺服器呼叫listen函式來宣告可以接收連線請求
int listen(int sockfd, int backing)
返回值:成功返回0 失敗返回-1
引數:backing:用於表示伺服器能接受的請求數量
accept
一旦伺服器呼叫了listen,socket就能接收連線請求。使用函式accept函式來接收並建立請求。
int accept(int sockfd, struct sockaddr *resrict addr, socklen_t *restrict len);
返回值:成功返回socket描述符,失敗返回-1
引數:sockfd 客戶端socket
len :addr的長度
1.accept返回乙個新的socket關聯到客戶端,它與原始的socket由相同的套接字型別和協議族,傳遞給accept的原始socket並沒有關聯客戶端。它繼續保持可用狀態,接受其他請求。
2.accept是乙個阻塞的函式,會一直等到有客戶端的請求
#include "sys/socket.h"
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "errno.h"
#include "sys/types.h"
#include "string.h"
#include "netinet/in.h"
#define max_listen
10char buf[
100]
;int main()
server_ip.sin_family =
af_inet
; server_ip.sin_port =
htons
(5678);
server_ip.sin_addr.s_addr =
htonl
(inaddr_any);
//自動設定
memset
(server_ip.sin_zero,0,
8); err=
bind
(sd,
( struct sockaddr *)(
&server_ip)
,sizeof
(struct sockaddr));
//2.繫結ip位址和埠資訊到soket
if(err==-1
) err =
listen
(sd,
max_listen);
//3.最大同時監聽數
if(err==-1
) remote_len =
sizeof
(struct sockaddr)
; ad =
accept
(sd,
(struct sockaddr*)(
&remote_ip)
,&remote_len)
;//4.阻塞等待來自客戶端的請求
if(ad==-1
)read
(ad, buf ,
100)
;//5.讀資料,把ad指定的檔案傳送100個位元組到buf
加入迴圈不斷確保有新的客戶端能連線,且在乙個個新執行緒中完成接收,通過互斥鎖對全域性變數num進行累加。
#include "sys/socket.h"
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "errno.h"
#include "sys/types.h"
#include "string.h"
#include "netinet/in.h"
#include "pthread.h"
#include "arpa/inet.h"
#define max_listen
10char buf[
100]
;int ad[10]
;int num=0;
struct sockaddr_in server_ip, remote_ip;
pthread_mutex_t mutex;
void
*thread_fun
(void
*arg)
return
null;}
int main()
server_ip.sin_family =
af_inet
; server_ip.sin_port =
htons
(5768);
server_ip.sin_addr.s_addr =
htonl
(inaddr_any);
//自動設定
memset
(server_ip.sin_zero,0,
8); err=
bind
(sd,
( struct sockaddr *)(
&server_ip)
,sizeof
(struct sockaddr));
if(err==-1
) err =
listen
(sd,
max_listen);
if(err==-1
) remote_len =
sizeof
(struct sockaddr)
; err =
pthread_mutex_init
(&mutex,
null);
//初始化
while(1
) err =
pthread_create
(&tid[i]
,null
,thread_fun,
(void
*)i);if
(err !=0)
i++;}
close
(sd)
;pthread_join
(tid[i]
,null);
pthread_mutex_destroy
(&mutex)
;return0;
}
用三個客戶端分別傳送 3 20 50 給,記錄累加和
初學網路程式設計
昨天到今天幾乎都在做這個問題,利用socket設計乙個簡單的聊天工具。現在可以說是成功了80 了。並通過學習這方面知識還補充了一些mfc和網路方面的知識,一舉好幾得。但是眼睛有點疲勞,因為對著顯示器的時間長了嘛!乙個最大的體會就是原來乙個聊天程式並沒有我以前想象的那麼難啊,計算機這東西怪不得有人說它...
網路程式設計(初學)
目錄 二 網路協議的五層模型 三 寫乙個客戶端和服務端的例子 b browser s server 瀏覽器 服務端,例如京東 天貓 b s架構本質也是c s架構 現在學習網路程式設計就是為了寫乙個c s架構的軟體 s端 伺服器端 網路 網路連線介質 網路協議 osi七層 網路協議 又稱osi七層協議...
初學網路程式設計
1.c s架構 c s架構 客戶端 client 服務端 server 架構,這種架構也是從使用者層面 也可是物理層面 來劃分的.這裡客戶端一般指需先安裝再執行的應用程式.對作業系統依賴性較大 服 務端即是這類程 序對應的伺服器.b s架構 browser server,瀏覽器端與伺服器端架構.也是...