环境:Linux

语言:C/C++

通信方式:TCP

  下面用TCP协议编写一个简单的服务器、客户端,其中服务器端一直监听本机的6666号端口。如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。

server.cpp

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

 client.cpp

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define MAXLINE 4096 int main(int argc, char** argv){
int sockfd, n;
char recvline[], sendline[];
struct sockaddr_in servaddr; if( argc != ){
printf("usage: ./client <ipaddress>\n");
return ;
} if( (sockfd = socket(AF_INET, SOCK_STREAM, )) < ){
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
return ;
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons();
if( inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= ){
printf("inet_pton error for %s\n",argv[]);
return ;
} if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < ){
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
return ;
} printf("send msg to server: \n");
fgets(sendline, , stdin);
if( send(sockfd, sendline, strlen(sendline), ) < ){
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
return ;
}
close(sockfd);
return ;
}

makefile

 all:server client
server:server.o
g++ -g -o server server.o
client:client.o
g++ -g -o client client.o
server.o:server.cpp
g++ -g -c server.cpp
client.o:client.cpp
g++ -g -c client.cpp
clean:all
rm all

  执行make命令后,生成server和client两个可执行文件。分别打开两个终端窗口,一个执行./server命令,一个执行./client 127.0.0.1命令,表示连上本机的6666端口,执行./server命令的要先执行。执行./client 127.0.0.1命令后,会提示说要发给server的内容,输入“hello”后,client客户端执行完毕,这时可以看到server的那个终端窗口输出“recv msg from client: hello”。继续执行./client 127.0.0.1命令后,再输入“haha”,server的终端继续输出“recv msg from client: haha”。结果如图所示。

TCP协议通信交互流程:

参考文献:

《后台开发:核心技术与应用实践》第六章,p206

最新文章

  1. 局域网聊天Chat(马士兵视频改进版)
  2. loj 1026( tarjan + 输出割边 )
  3. 内存泄漏检测工具Valgrind
  4. (转载)UITableView使用详解
  5. Xcode常见错误以及解决方案
  6. 25045操作标准子程序集41.C
  7. [Swust OJ 137]--波浪数(hash+波浪数构造)
  8. ref引用类型,数组型参数,out输出参数
  9. hdu_5925_Coconuts(离散化+dfs)
  10. html5只需要&lt;!DOCTYPE HTML&gt;的原因
  11. ASP.NET下MVC设计模式的实现
  12. Codeforces Round #443 (Div. 1) C. Tournament
  13. Linux ISO镜像挂载
  14. html调用html的方法
  15. JavaScript 为什么不要使用 eval
  16. MT【98】三元对称不等式
  17. Parquet列式存储格式
  18. spring4.1.6配置quartz2.2.1(maven) &lt;转&gt;
  19. 配置Hibernate的流程
  20. Intellig IDEA 搭建spring boot 热部署

热门文章

  1. mac host文件配置
  2. 最小生成树Prim算法和Kruskal算法
  3. (最小生成树 Prim) nyoj1403-沟通无限校园网
  4. (进制转换 栈)P1143 进制转换 洛谷
  5. schtasks计划任务
  6. 面向对象【day08】:异常处理-断言(七)
  7. java动态获取上传文件的编码类型
  8. Address already in use : connect 的解决办法
  9. HDU 1016(素数环 深搜)
  10. Tooltip导致的无法访问已释放对象