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...