TCP併發伺服器

2021-09-30 13:45:59 字數 3648 閱讀 6706

int main()

; int recvcnt = 0;

struct sockaddr_in sock_server = ;

struct sockaddr_in sock_client = ;

int len = sizeof(struct sockaddr);

socketfd = socket(pf_inet, sock_stream, 0);

if (-1 == socketfd)

printf("socket success..\n");

sock_server.sin_family = af_inet;

sock_server.sin_port = myport;

sock_server.sin_addr.s_addr = inet_addr(myaddr);

ret = bind(socketfd, (struct sockaddr *)&sock_server, sizeof(struct sockaddr));

if (-1 == ret)

printf("bind success...\n");

ret = listen(socketfd, sock_stream);

if (-1 == ret)

printf("listen success...\n");

while(1)

printf(「accept success…\n」);

pid = fork();

if (0 == pid)

else

if (strcmp(recvbuf,"end") ==0)

}

}else if (pid > 0)

}close(socketfd);

return 0;

客戶端:

int main()

; int ret = 0;

char msg[20] = ;

socketfd = socket(pf_inet, sock_stream, 0);

if (-1 == socketfd)

printf(「socket success..\n」);

sock_server.sin_family = af_inet;

sock_server.sin_port = myport;

sock_server.sin_addr.s_addr = inet_addr(myaddr);

ret = connect(socketfd, (struct sockaddr*)&sock_server, sizeof(struct sockaddr));

if (-1 == ret)

printf("connect success..\n");

int sencnt = 0;

while (1)

if (strcmp(msg,"end") ==0)

}return 0;

標頭檔案:

api函式的介紹:

int socket(int domain, int type, int protocol);

功能:建立用於通訊的套接字(插座);

引數:

domain:位址族;af_inet / pf_inet表示的是ipv4,af_inet6 / pf_inet6表示的是ipv6;

type:

指定通訊的型別;

對於我們現階段的常用的有sock_stream(順序、可靠,雙向,基於連線的===》用於tcp)

sock_dgram(不是基於連線的,不是可靠的===》udp)

protocol:對於特定的套接字一般只提供乙個協議,這個時候就可以把protocol賦值為0;

返回值:

成功返回檔案描述符,失敗返回-1;

int bind(int sockfd,const struct sockaddr *my_addr, socklen_t addrlen);

引數:

sockfd:socket函式返回的檔案描述符;

my_addr:結構體指標,它指向的結構體儲存位址族、ip位址和埠號;

addrlen:就是my_addr的大小;

返回值:

成功返回0,失敗返回-1;

注意:(struct sockaddr *)只是防止編譯警報;

int listen(int sockfd, int backlog);

功能:設定掛起佇列的數量;

引數: sockfd:.....

backlog:掛起佇列的最大長度;

返回值:

成功返回0,失敗返回-1;

注意點:listen只能夠用於sock_stream和 sock_seqpacket*****》不能夠用於sock_dgram;

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:進行監聽;

引數:

sockfd:socket返回的檔案描述符;

addr:用來儲存客戶端那邊的位址族、ip位址和埠號;

addrlen:是addr的位元組大小;

返回值:

成功返回乙個新的檔案描述符===》有客戶端來連線伺服器,accept會建立乙個新的檔案描述符來表示客戶端;

例子:有a b c客戶端來連線伺服器,acceppt呼叫之後,會分別給a b c再用乙個新的數字來表示,比如給a是4 ,b是5,c是6;

失敗返回-1;

注意點:只能夠用於基於連線的協議;===》sock_stream和 sock_seqpacket

如果沒有客戶端連線的時候,會阻塞在accept處!

int bind (int sockfd,const struct sockaddr *my_addr, socklen_t addrlen);

int connect(int sockfd,const struct sockaddr *serv_addr, socklen_t addrlen);

功能:連線伺服器;

引數: sockfd:socket返回的檔案描述符;

server_addr:儲存的是要連線的伺服器端的位址族、ip位址、埠號!

addrlen:就是server_addr的結構體大小;

返回值:

成功返回0,失敗返回-1;

比較bind和connect的區別:

相同點:函式引數和返回值都是一樣的;

不同點:

1、功能是不一樣的;bind是給伺服器程式繫結所執行電腦的ip位址,以及設定埠號;connect連線另外一台電腦上的伺服器

connect在客戶端呼叫,客戶端執行在b(192.168.1.100)電腦上,因為connect是連線伺服器的===》伺服器由執行在

電腦a上===》所以connect連線的是a電腦的ip位址、埠號;而不是b電腦的ip位址和埠號!

規律:返回值:

成功 失敗

檔案描述符(socket和aeecpt) -1

0(剩餘其他的) -1

TCP併發伺服器程式

include include include include include define portno 3333 define size 1024 int main bzero server addr,sizeof struct sockaddr in server addr.sin famil...

TCP併發伺服器模型(一)

本篇敘述的tcp併發伺服器模型如下圖所示 伺服器建立並繫結套接字後fork出幾個子程序,子程序中分別進行accept 該函式為阻塞函式 recv 處理資料然後再次acept,這樣迴圈下去。所有客戶端發來的資訊都是直接由子程序處理。例程 如下,在處理客戶端請求之前,伺服器先fork了3個子程序,然後將...

IO模型與TCP併發伺服器

io模型與tcp併發伺服器 io模型 1 阻塞io 2 非阻塞io 3 io多路復用 4 訊號驅動io 1 阻塞io 最常用 預設設定 io scanf printf 預設的io裝置 fgetc fputc 標準io fgets fputs fread fwrite read write 檔案io,...