-
使用ubuntu16.04
-
服务端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <sys/socket.h>
int main(int argc, char *argv[])
{
int fd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port = htons(6666);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
listen(fd,128);
struct sockaddr_in cli_addr;
socklen_t cli_len=sizeof(cli_addr);
int cfd=accept(fd,(struct sockaddr*)&cli_addr,&cli_len);
char buf[1024];
int res=read(cfd,buf,sizeof(buf));
for(int i=0;i<res;i++){
buf[i]=toupper(buf[i]);
}
write(cfd,buf,res);
close(cfd);
close(fd);
return 0;
}
- 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/socket.h>
int main(int argc, char *argv[])
{
int fd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in cli_addr;
cli_addr.sin_family = AF_INET;
cli_addr.sin_port = htons(25555);
inet_pton(AF_INET,"192.168.31.40",&cli_addr.sin_addr.s_addr);
socklen_t cli_len=sizeof(cli_addr);
connect(fd,(struct sockaddr*)&cli_addr,cli_len);
char buf[30]={0};
fgets(buf,sizeof(buf),stdin);
write(fd,buf,strlen(buf));
int res=read(fd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,sizeof(buf));
close(fd);
return 0;
}
- 效果展示图
- 总结
- 简单实现两端TCP连接
- 没有加入错误处理封装(包裹函数)
- 通过setsockopt函数实现端口复用
- 没有处理客户端异常中断(例如:按键结束)时,服务端的响应问题,可以添加判断语句,异常中断就continue。
- 小功能实现:客户端输入字母,服务端将其转化为大写字母返回客户端。