【发布时间】:2020-08-26 02:07:03
【问题描述】:
我有以下用于 TCP 客户端的 C 代码:
#define PORT 8888
void connexion(int sock)
{
fd_set rfds;
struct timeval tv;
int retval;
FD_ZERO(&rfds);
FD_SET(0, &rfds);
FD_SET(sock, &rfds);
char buf[512];
retval = select(3, &rfds, NULL, NULL, NULL);
if (retval == -1)
perror("select()");
else if (retval) {
read(retval, buf, 512);
printf("\nbuf: %s", buf);
memset(buf, 0, 512);
}
connexion(sock);
}
int main(int argc, char const *argv[])
{
int sock = 0, valread;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[1024] = {0};
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)
{
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
return -1;
}
connexion(sock);
}
我尝试在不停止读取套接字的情况下读取标准输入。确实,我需要能够在写消息的同时接收消息。为此,我使用了选择功能。但我只从终端接收消息,从不接收来自服务器的消息。
服务器仍然收到来自客户端的套接字...这段代码有什么问题?
提前谢谢你。
【问题讨论】:
-
in
select(3, &rfds, NULL, NULL, NULL);3 必须替换为sock+1 -
read(retval, buf, 512);这里的retval可能是0或1,你想要retval = read(soc, buf, 512);
标签: c sockets select networking tcp