C++ socket初探 實現局域網聊天功能

本文講述socket客戶端和服務端的簡單實現。

客戶端

用到的頭文件及用法

<code>#include /*獲取設置socket,bind*/ #include /*基本數據類型,如time_t*/ #include /*用於socketaddr_in結構體,htons系統調用*/ #include /*對read write提供支持*/ #include /*提供 inet_addr*/ #include #include /<code>程序原理先聲明一個存放端口和協議類型的結構體對象。sockret=socket(AF_INET,SOCK_STREAM,0);設置好連接的方式

<code>sock.sin_family = AF_INET; sock.sin_addr.s_addr = inet_addr("127.0.0.1"); sock.sin_port = htons(4000);//40975 len=sizeof(sock); result=connect(sockret,(struct sockaddr*)&sock,len); /<code>向服務端收發數據

<code>write(sockret,&ch,1); read(sockret,&ch,1); /<code>

3.源代碼如下

<code>#include /*獲取設置socket,bind*/ #include /*基本數據類型,如time_t*/ #include /*用於socketaddr_in結構體,htons系統調用*/ #include /*對read write提供支持*/ #include /*提供 inet_addr*/ #include #include using namespace std; int main() { int sockret; int len; struct sockaddr_in sock; int result; char ch='J'; /*AF_INET是ipv4,sock流是tcp協議*/ sockret=socket(AF_INET,SOCK_STREAM,0); /*連接方式,IP ,端口,端口用大小端轉換*/ sock.sin_family = AF_INET; sock.sin_addr.s_addr = inet_addr("127.0.0.1"); sock.sin_port = htons(4000);//40975 len=sizeof(sock); result=connect(sockret,(struct sockaddr*)&sock,len); if(result!=0) { perror("clinent error"); } write(sockret,&ch,1); read(sockret,&ch,1); cout服務端

主要負責監聽端口,並且響應連接請求。

<code>#include #include #include #include #include #include #include #include #define MAXLINE 4096 int main(){ int listenfd, connfd; struct sockaddr_in servaddr; char buff[4096]; int n; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); return 0; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(4000); if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); return 0; } if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); return 0; } printf("======waiting for client's request======\n"); while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0'; printf("recv msg from client: %s\n", buff); close(connfd); } close(listenfd); return 0; } /<code>

總結

有後續的內容,以後再補充吧