日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

学习笔记:linuxsocket通信基础

發布時間:2025/3/13 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记:linuxsocket通信基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習吳哥的linux編程基礎教程中,在socket通信基礎的示例代碼實現的過程中出現了一些小問題,服務端程序能夠運行正常,但是客戶端程序總是連接不上,最后發現原因是 沒有正確填寫本機的ip地址,第二次嘗試時把htons寫成了htonl,編譯器也沒有報錯,這里記錄下來。

關于socket通信過程總結,
服務端socket通信:
1.創建服務端的socket
2.把服務端用于通信的地址和端口綁定到socket撒花姑娘
3.把socket設置為監聽模式
4.接受客戶端的連接
5.與客戶端通信,接受客戶端發過來的報文后,回復處理結果
6.不斷重復5,知道客戶端斷開連接
7.關閉socket,釋放資源

客戶端socket通信
1.創建客戶端的socket
2.與服務器發起連接請求
3.與服務端通信,發送一個報文后等待回復,然后發送下一個報文
4.不斷重復3,知道所有的數據發送完
5.關閉socket,釋放資源

函數小結
服務端函數調用的流程是:socket->bind->listen->accept->recv/send->close

客戶端函數調用的流程是:socket->connect->send/recv->close

其中send/recv可以進行多次交互。

服務端代碼

#include<stdio.h> #include<string.h> #include<unistd.h> #include<netdb.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h>int main() {//第一步:創建服務端的socketint listenfd = socket(AF_INET,SOCK_STREAM,0);//第二部:把服務端用于通信的地址和端口綁定到socket上struct sockaddr_in servaddr;//服務端地址信息的數據結構memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;//協議簇,在socket編程中只能是AF_INET//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//任意ip地址servaddr.sin_addr.s_addr = inet_addr("192.168.193.128");//指定主機ip地址servaddr.sin_port = htons(5000);//指定通信端口if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))!=0){perror("bind");close(listenfd);return -1;}//第三步:把socket設置為監聽模式if(listen(listenfd,5)!=0){perror("listen");close(listenfd);return -1;}//第四步:接受客戶端連接int clientfd;//客戶端的socketint socklen=sizeof(struct sockaddr_in);//struct sockaddr_in 的大小struct sockaddr_in clientaddr;//客戶端的地址信息clientfd= accept(listenfd,(struct sockaddr*)&clientaddr,(socklen_t*)&socklen);printf("客戶端(%s)已經連接。\n",inet_ntoa(clientaddr.sin_addr));//第五步:與客戶端通信,接受客戶端發過來的報文后恢復okchar buffer[1024];while(1){memset(buffer,0,sizeof(buffer));if(recv(clientfd,buffer,sizeof(buffer),0)<=0)break;//接收客戶端的請求報文。printf("接收:%s\n",buffer);strcpy(buffer,"ok");if(send(clientfd,buffer,strlen(buffer),0)<=0)break;//向客戶端發送響應結果printf("發送:%s\n",buffer);}//第六步:關閉socket,釋放資源close(listenfd);close(clientfd); }

客戶端代碼

#include<stdio.h> #include<string.h> #include<unistd.h> #include<netdb.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h>int main() {//第一步:創建客戶端socketint sockfd = socket(AF_INET,SOCK_STREAM,0);//第二步:向服務器發送連接請求struct hostent* h;if((h = gethostbyname("192.168.193.128 "))==0)//指定服務端ip地址{perror("gethostbyname");close(sockfd);return -1;}struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(5000);//指定服務端的通信端口memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))!=0)//向服務端發起連接請求{perror("connect");close(sockfd);return -1;}char buffer[1024];//第3步:與服務端通信,附送一個報文后等待回復,然后再發下一個報文、for(int ii=0;ii<3;ii++){memset(buffer,0,sizeof(buffer));sprintf(buffer,"這是第%d個超級女生,編號%03d.",ii+1,ii+1);if(send(sockfd,buffer,strlen(buffer),0)<=0)break;//向服務端發送請求報文。printf("發送:%s\n",buffer);memset(buffer,0,sizeof(buffer));if(recv(sockfd,buffer,sizeof(buffer),0)<=0)break;//接收服務端返回的結果printf("接收:%s\n",buffer);}//第四步:關閉socket,釋放資源close(sockfd); }

總結

以上是生活随笔為你收集整理的学习笔记:linuxsocket通信基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。