網路程式設計 TCP有關函式

2021-07-24 10:33:20 字數 4187 閱讀 8907

1、socket函式

原型:int socket(int family, int type, int protocol);

作用:建立一下新的socket套接字

型別:sock_stream 用於tcp

sock_dgram  用於udp

protocol:傳輸協議編號,設為0即可

返回值:成功返回socket套接字描述符;失敗返回-1。

標頭檔案:#include

#include

2、bind函式

原型:int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); 

引數:sockfd:套接字描述符

struct sockaddr_in

;addrlen:為引數sockaddr的長度

返回值:成功返回0,失敗返回-1,錯誤的原因在errno中

標頭檔案:#include

#include

在bind之前要先對結構體進行設定:

bzero(&servaddr, sizeof(servaddr)); 

servaddr.sin_family = af_inet; 

servaddr.sin_addr.s_addr = htonl(inaddr_any);

servaddr.sin_port = htons(serv_port);

首先將整個結構體清零,然後設定位址型別為af_inet,網路位址為inaddr_any,這個巨集表示本地的任意ip位址,因為伺服器可能有多個網絡卡,每個網絡卡也可能繫結多個ip位址,這樣設定可以在所有的ip位址上監聽,直到不某個客戶端建立了連線時才確定下來到底用哪個ip位址,埠號為serv_port,我們定義為8000 

3、listen

原型:int listen(int sockfd,int backlog);

作用:監聽網路,等待引數sockfd的socket連線

引數:sockfd:套接字描述符

backlog:同時能處理的最大連線要求

返回值:成功返回0,失敗返回-1,錯誤原因在errno

標頭檔案:#inlcude

注意:listen並未真正開始接收連線,真正接受client端連線的是accept

4、accpet

原型:int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); 

作用:用於接受socket的連線

引數:sockfd:套接字描述符

addrlen:sockaddr的位址

返回值:成功返回新的套接字,失敗返回-1

標頭檔案:

#include

#include

5、connect

原型:int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 

作用:建立socket套接字,通常客戶端連線伺服器

引數:sockfd:套接字描述符

addr:sockaddr的結構體

addrlen:sockaddr的長度

返回值:成功返回0,失敗返回-1

標頭檔案:

#include

#include

6、send

原型:int send(int sockfd,const void*msg,int len ,unsigned int falgs);

作用:經過socket傳送資料,向對方傳送資料

引數:sockfd:套接字描述符,在伺服器那端接受的應該為accept返回的新的描述符

msg:欲連線的的資料內容

len:資訊的長度

falgs:一般設為0

返回值:成功返回實際傳送出去的字元數,失敗返回-1,錯誤原因在errno中

標頭檔案:

#include

#include

7、recv

原型:int recv(int sockfd,void*buf,int len,unsigned int flags);

作用:經過socket接受套接字

引數:sockfd:套接字描述符,在伺服器那端接受的應該為accept返回的新的描述符

buf:接受資料的空間

len:接受字元的長度

flags:一般設定為0

返回值:成功返回接受的字元數,失敗-1

標頭檔案:

#include

#include

tcp伺服器:

#include #include #include #include #include #include #include #include #define portnumber 3333

int main(int argc, char *argv)

bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0

server_addr.sin_family=af_inet; // internet

server_addr.sin_addr.s_addr=htonl(inaddr_any); // (將本機器上的long資料轉化為網路上的long資料)和任何主機通訊 //inaddr_any 表示可以接收任意ip位址的資料,即繫結到所有的ip

//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用於繫結到乙個固定ip,inet_addr用於把數字加格式的ip轉化為整形ip

server_addr.sin_port=htons(portnumber); // (將本機器上的short資料轉化為網路上的short資料)埠號

// server_addr.sin_addr.s_addr=inet_addr("192.168.1.199");//;htonl(inaddr_any);

/* **sockfd描述符到ip位址 */

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

if (listen(sockfd, 5)==-1)

while(1)

fprintf(stderr,"server get connection from %s\n",inet_ntoa(client_addr.sin_addr));

if((nbytes=read(new_fd,buffer,1024))==-1)

buffer[nbytes]='\0';

printf("server received %s\n",buffer);

/* 這個通訊已經結束 */

close(new_fd);

/* 迴圈下乙個 */

} /* 結束通訊 */

close(sockfd);

exit(0);

}

tcpclient.c

#include #include #include #include #include #include #include #include #define portnumber 3333

int main()

bzero(&serv_addr,sizeof(serv_addr));

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(portnumber);

serv_addr.sin_addr.s_addr=inet_addr("192.168.1.199");

if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) <0)

if( send(sockfd, buf, strlen(buf), 0 ) <0)

close(sockfd);

}

有關網路程式設計

1.使用getaddrinfo獲取主機ip,這種方法受系統,hostname與ip的繫結配置有關,最後不要用localhost,一般localhost配置的ip為127.0.0.1 另一種方法是使用getifaddress,沒用過 int getip char host,char buf,int s...

TCP網路程式設計

基於tcp 通訊模型 由上圖可以得出tcp通訊的步驟如下 服務端 1 建立乙個socket,用函式socket 2 繫結ip位址 埠等資訊到socket上,用函式bind 3 設定允許的最大連線數,用函式listen 4 等待來著客戶端的連線請求,用函式accept 5 收發資料,用函式send 和...

網路程式設計 TCP

客戶端 1.建立客戶端的socket服務,指定目的主機和埠 2.為了傳送資料,應該獲取socket中的輸出流 3.獲取socket中的輸入流來獲取服務端的反饋資料 4.關閉資源 服務端 1.建立服務端的serversocket服務,並監聽乙個埠 2.通過accept方法 等待並獲取連線過來的客戶端s...