所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。
对!客户端也可以使用 write() / send() 函数向服务器发送数据,服务器也可以使用 read() / recv() 函数接收数据。
服务端代码 server.c:
- #include <stdio.h>
- /* For socket functions*/
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <errno.h>
- int main(int c, char ** v)
- {
- /* 创建Socket */
- int serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (serverSock < 0)
- {
- printf("socket error\n");
- return 1;
- }
- /* 绑定Socket */
- struct sockaddr_in addr = {0};
- addr.sin_family = AF_INET;
- /* 绑定IP地址为0,即绑定所有网卡 */
- //addr.sin_addr.s_addr = inet_addr("100.95.139.78");
- addr.sin_port = htons(8093);
- if (0 != bind(serverSock, (struct sockaddr*)&addr, sizeof(addr)))
- {
- printf("bind error errno = %d.\n", errno);
- return 1;
- }
- /* 启动监听 */
- if (0 != listen(serverSock, 20))
- {
- printf("listen error\n");
- return 1;
- }
- /* 等待客户端连接 */
- struct sockaddr_in clientAddr;
- socklen_t addrLen = sizeof(clientAddr);
- int clientSock = accept(serverSock, (struct sockaddr *)&clientAddr, &addrLen);
- /* 接收数据 */
- char buf[512] = {0};
- int len = recv(clientSock, buf, 512, 0);
- /* 发送数据 */
- send(clientSock ,buf, len, 0);
- /* 使用read/write函数进行Socket套接字读写 */
- //int len = read(clientSock, buf, 512);
- //write(clientSock, buf, len);
- /* 关闭Socket */
- close(clientSock);
- close(serverSock);
- return 0;
- }
客户端代码 client.c
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <errno.h>
- int main(int c, char ** v)
- {
- /* 创建Socket */
- int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock <= 0)
- {
- printf("socket error errno = %d.\n", errno);
- }
- /* 连接服务端 */
- struct sockaddr_in addr = {0};
- addr.sin_family = AF_INET;
- addr.sin_port = htons(8093);
- addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- connect(sock, (struct sockaddr*)&addr, sizeof(addr));
- char buf[] = "My Name is Weiyyi, I am 2 months old.";
- send(sock, buf, sizeof(buf), 0);
- char recvBuf[128] = {0};
- recv(sock, recvBuf, 128, 0);
- close(sock);
- return 0;
- }
联系客服