linux平台下server端的一个小错误

操作步骤:用一个最简单的client、server测试数据传输,client发送数据,server接收数据。

 

错误提示: transport endpoint is not connected

 

错误原因: 这个错误往往是在server端提示的,意思是“传输端点没有连上”。

                百思不得其解,socket明明连上了啊,怎么说没有连上呢。

                又检查了下代码才发现原因:笔误加大脑处于休眠状态写的测试代码.

               (以后大脑要是不清醒,宁愿看小说都不写代码了)

                server的accept(socketFD,......)返回了一个新的newSocketFD,

                我在recv时传的居然不是newSocketFD.而是socketFD值。回头看下那个错误提示:

               的确是“传输端点没有连上”。

 

解决办法:  将recv的第一个参数改成accept返回的newSocketFd值即可。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,需要使用 Linux 中的 socket API 创建一个 socket,并将其设置为非阻塞模式。然后,使用 bind() 和 listen() 将 socket 绑定到特定的 IP 地址和端口上。 在服务器端,使用 accept() 接受客户端的连接请求。如果 accept() 返回 EAGAIN 或 EWOULDBLOCK 错误,则说明此时没有可用的连接请求,程序应该继续监听。 在接受到客户端的连接请求后,可以使用 recv() 或 read() 接收客户端发送的数据,并使用 send() 或 write() 向客户端发送数据。 示例代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <fcntl.h> #define PORT 4444 int main(){ int sockfd, ret; struct sockaddr_in serverAddr; int newSocket; struct sockaddr_in newAddr; socklen_t addr_size; char buffer[1024]; pid_t childpid; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0){ printf("[-]Error in connection.\n"); exit(1); } printf("[+]Server Socket is created.\n"); memset(&serverAddr, '\0', sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); if(ret < 0){ printf("[-]Error in binding.\n"); exit(1); } printf("[+]Bind to port %d\n", 4444); if(listen(sockfd, 10) == 0){ printf("[+]Listening....\n"); } ### 回答2: 编写Linux服务器端网络非阻塞收发程序可以采用多种编程语言,比如C/C++或者Python。下面是一个用C语言编写的Linux服务器端网络非阻塞收发程序的简单实现: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } // 设置socket为非阻塞模式 int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 12345; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("ERROR on binding"); exit(1); } listen(sockfd, 5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) { perror("ERROR on accept"); exit(1); } // 设置newsockfd为非阻塞模式 flags = fcntl(newsockfd, F_GETFL, 0); fcntl(newsockfd, F_SETFL, flags | O_NONBLOCK); bzero(buffer, 256); int n = read(newsockfd, buffer, 255); if (n < 0) { perror("ERROR reading from socket"); exit(1); } printf("Message from client: %s\n", buffer); n = write(newsockfd, "Server received your message", 28); if (n < 0) { perror("ERROR writing to socket"); exit(1); } close(newsockfd); close(sockfd); return 0; } 在该程序中,首先创建一个socket,并将其设置为非阻塞模式。然后绑定服务器地址和端口号,并监听连接请求。当有客户端请求连接时,接受连接,并将新的socket设置为非阻塞模式。然后从客户端读取数据,打印出来,并向客户端发送一条确认消息。 注意,这只是一个简单的示例程序,实际上,在网络编程中,还需要考虑更多的边界条件和错误处理。编写完整的网络非阻塞收发程序需要更多的代码和错误处理机制。 ### 回答3: 编写一个Linux服务器端的非阻塞网络收发程序,可以使用C语言来实现。 首先,我们需要创建一个套接字(socket)来建立服务器端的网络连接。使用`socket()`系统调用来创建套接字,指定协议族(如IPv4或IPv6)和套接字类型(如TCP或UDP)。 接下来,我们需要将套接字绑定到一个本地IP地址和端口号上,以便能够监听来自客户端的连接请求。使用`bind()`系统调用来完成绑定操作,并指定IP地址和端口号。 然后,我们调用`listen()`系统调用来监听套接字,指定等待连接队列的最大长度。此时,服务器已经准备好接受客户端的连接请求。 接下来,我们需要创建一个非阻塞套接字,以便在进行数据收发时不会阻塞自身的执行。通过设置套接字的文件描述符属性为非阻塞(使用`fcntl()`系统调用),我们可以实现非阻塞网络收发。 在循环中,我们使用`accept()`系统调用来接受客户端的连接请求,并返回一个新的套接字,用于与客户端进行数据收发。若没有新的连接请求,`accept()`将会返回-1,此时我们可以通过`errno`变量来判断是否是因为套接字设置为非阻塞而导致的阻塞。 一旦有新的连接请求被接受,我们就使用`recv()`系统调用来接收客户端发送的数据,并使用`send()`系统调用来向客户端发送数据。同样,由于套接字设置为非阻塞,这些系统调用不会导致服务器阻塞在数据收发的过程中。 最后,我们关闭服务器套接字和客户端套接字,并释放相应的资源。 这样就实现了一个非阻塞的Linux服务器端网络收发程序。在实际使用中,可以根据具体需求进一步优化和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值