- #include
- #include
- #include
- int main(int argc, char const *argv[])
- {
- // 创建流式套接字
- int cfd = socket(AF_INET, SOCK_STREAM, 0);
- if (0 == cfd)
- {
- perror("socket");
- printf("__%d__\n", __LINE__);
- return -1;
- }
- // 允许端口快速复用
- int reuse = 1;
- if (setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
- {
- perror("setsockopt");
- printf("__%d__", __LINE__);
- return -1;
- }
- printf("允许端口快速复用成功\n");
- // 绑定服务器的地址信息//非必要
- struct sockaddr_in sin;
- sin.sin_family = AF_INET; // 必须填AF_INET
- sin.sin_port = htons(7777); // 服务器绑定的端口
- sin.sin_addr.s_addr = inet_addr("192.168.125.17"); // 服务器绑定的IP
- // 连接服务器需要填服务器的地址信息
- if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
- {
- perror("connect");
- printf("__%d__", __LINE__);
- return -1;
- }
- char buf[128] = "";
- int res = 0;
- ssize_t s_res = -1;
- // 创建读集合
- fd_set readfds, writepfds;
- // 清空集合
- FD_ZERO(&readfds);
- // 添加文件描述符到集合中
- FD_SET(0, &readfds);
- FD_SET(cfd, &readfds);
- FD_SET(cfd, &writepfds);
- int maxfd = cfd;
- while (1)
- {
- // 调用IO多路复用函数,阻塞检测集合
- s_res = select(maxfd + 2, &readfds, &writepfds, NULL, NULL);
- if (s_res < 0)
- {
- perror("select");
- return -1;
- }
- else if (0 == s_res)
- {
- puts("time out....");
- break;
- }
- if (FD_ISSET(cfd, &writepfds) == 0)
- continue;
- else
- {
- // 发送数据
- char buf[128] = "";
- fgets(buf, sizeof(buf), stdin);
- buf[strlen(buf) - 1] = 0;
- send(cfd, buf, sizeof(buf), 0);
- if (strcmp(buf, "quit") == 0)
- break;
- printf("发送成功\n");
- // 接收数据
- bzero(buf, sizeof(buf));
- res = recv(cfd, buf, sizeof(buf), 0);
- printf("[%s : %d] newsfd=%d , %s , __%d__\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), cfd, buf, __LINE__);
- }
- }
- // 关闭套接字
- close(cfd);
- retern 0;
-
- ]