所以,我正在使用C中的TCP套接字连接。我创建了一个echo服务器,它使用getaddrinfo(),然后bind(),listen(),accept,最后启动while循环接收数据直到客户端断开连接。
问题在于:代码显然有效,但当客户端断开连接时,循环中收到的数据会显示为 ONLY 。我希望发送到服务器的数据在连接客户端时显示,就像一个简单的聊天。数据被发送,服务器立即看到它。
所以,这是代码:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
int main(void) {
struct sockaddr_storage their_addr;
socklen_t addr_size;
struct addrinfo hints, *res;
int sockfd, newfd;
int numbytes;
char buf[512];
// first, load up address structs with getaddrinfo():
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE; // fill in my IP for me
getaddrinfo(NULL, "7890", &hints, &res);
// make a socket, bind it, and listen on it:
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
bind(sockfd, res->ai_addr, res->ai_addrlen);
listen(sockfd, 1);
// now accept an incoming connection:
addr_size = sizeof(their_addr);
newfd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size);
while((numbytes = recv(newfd, buf, sizeof(buf), 0)) > 0) {
buf[numbytes] = '\0'; // sets the character after the last as '\0', avoiding dump bytes.
printf("%s", buf);
}
return 0;
}
如果这与任何方式相关,我正在运行Linux。但是,我发现了一些东西。如果我删除循环,使用服务器接收只有一个数据,文本会立即显示。我使用一个简单的Python客户端来发送数据,这里是客户端的代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 7890))
s.send("hey server!")
希望有人可以帮助我,提前感谢任何尝试的人!
答案 0 :(得分:0)
python发送的示例有以下几种:
def mysend(self, msg):
totalsent = 0
while totalsent < MSGLEN:
sent = self.sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
原因是在套接字关闭或遇到换行符之前可能无法发送数据。有关详细信息,请参阅Python Socket Programming HOW-TO
答案 1 :(得分:0)
\ n起作用的原因是因为缓冲已设置或默认为_IOLBUF。
有关可以管理文件(或STDOUT)缓冲区的不同方法的说明,请参阅函数setvbuf()
。
最后,作为注释,如果你发出fflush(stdout);
,这会强制刷新缓冲区,并且与文件缓冲标志的值无关。