深圳营销网站建站公司,驻马店市旅游网站建设,一流的中小型网站建设,做网站设计的公司上篇文章我们学习了TCP的服务器端模式的编写#xff0c;这篇文章我们将开始编写客户端的代码#xff0c;完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同#xff0c;在客户端我们只需要服务器端的套接字和服务器端的地址和端口#xff0c;用于向…上篇文章我们学习了TCP的服务器端模式的编写这篇文章我们将开始编写客户端的代码完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同在客户端我们只需要服务器端的套接字和服务器端的地址和端口用于向服务器发送连接请求。
这里定义了客户端套接字服务器端的地址和端口和上篇文章服务器端的编写一样详细原理请见上篇文章。
代码生成创建了客户端的套接字把服务器端的地址和端口初始化。这里是本机循环的IP地址自己写入自己读取 int s;struct sockaddr_in server_addr;s socket(AF_INET,SOCK_STREAM,0);if(s 0){printf(socket error \n);return -1;}bzero(server_addr,sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_addr.s_addr inet_addr(127.0.0.1);server_addr.sin_port htons(Port);然后是connect函数发送连接请求s是客户端套接字因为系统会分配端口所以不用bind()再进行绑定详细请看第一篇文章这里客户端套接字向服务器端套接字发送连接请求如果返回-1说明请求连接失败。 if (connect(s, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) 0) {perror(connect error);return -1;} 接着我们要对客户端套接字进行读取和写入的处理如下面的函数所示建立完连接之后进入读写的循环这里是从标准输入0终端输入读取向服务器端写入。
int process_conn_server(int s){ssize_t size 0;char buffer[1024] {0} ;char message [100] {0};for(;;){memset(buffer, 0, sizeof(buffer));size read(0,message,sizeof(message));if(size 0){return -1;}sprintf(buffer,message: %s ,message);write(s,buffer,strlen(buffer));}return 0;
} 至此我们的客户端的功能全部实现下面是完整的代码
#include stdio.h
#include stdlib.h
#include string.h
#include sys/types.h
#include sys/socket.h
#include unistd.h
#include arpa/inet.h#define Port 8888int process_conn_server(int s){ssize_t size 0;char buffer[1024] {0} ;char message [100] {0};for(;;){memset(buffer, 0, sizeof(buffer));size read(0,message,sizeof(message));if(size 0){return -1;}sprintf(buffer,message: %s ,message);write(s,buffer,strlen(buffer));}return 0;
}int main(int argc,char* argv[]){int s;struct sockaddr_in server_addr;s socket(AF_INET,SOCK_STREAM,0);if(s 0){printf(socket error \n);return -1;}bzero(server_addr,sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_addr.s_addr inet_addr(127.0.0.1);server_addr.sin_port htons(Port);if (connect(s, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) 0) {perror(connect error);return -1;}process_conn_server(s);close(s);return 0;
} 最后我们要实现服务器端和客户端的通信
首先是创建一个makefile文件用来编译生成两个目标程序server和client。
CC gcc
CFLAGS -Wall -g
TARGETS server clientall: $(TARGETS)server: server.c$(CC) $(CFLAGS) -o server server.cclient: client.c$(CC) $(CFLAGS) -o client client.cclean:rm -f $(TARGETS)先去确认一下client.c和server.c以及makefile都在同一个文件夹路径下然后进入我们的终端注意是要在三个文件的文件夹路径下执行make指令来进行编译。这里因为我编译过了所以提示没有改变如果没有编译过会提示生成了可执行文件。 然后在两个终端中分别执行服务器端的程序和客户端程序
现在你可以尝试着在客户端发送一些字符了因为我的代码的程序是客户端从终端读取写入到服务器端服务器端读取写入到终端去。所以会出现下面的结果可以看到服务器端的终端成功打印了代码至于为啥有两个换行我认为是在客户端输入到终端的时候需要回车多输入了一个换行符这个可以自行进行修改。
自此我们的服务器端和客户端之间的通信可以正常运行了当然你可能会遇到不同的问题 首先就是客户端connect error的问题这是因为要先开启服务器端的程序然后再开启客户端的程序因为accept()是阻塞的等待连接请求。 其次可能出现 bind error的问题这是因为你的刚运行的服务器端的程序的端口还在被占用即使你关闭了程序不用担心系统会回收端口等一会就可以继续使用该端口。 我目前还没有尝试不同设备之间的通信但是我认为是没有问题的我打印了客户端的端口会发现是系统分配的端口只是没有测试不同IP。 最后十分感谢阅读希望文章内容对你有所帮助如有错误欢迎指出。