gpt4 book ai didi

c - 我如何设置套接字来执行 "send/receive"或 "receive/send"

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:16 26 4
gpt4 key购买 nike

如果数据是从另一台计算机(首先)“发送”的,我如何设置我的套接字例程以“发送”(首先)或(切换)“接收”?

谢谢

通用代码:

-(void) TcpClient{
char buffer[128];
struct sockaddr_in sin;
struct hostent *host;
int s;

host = gethostbyname("10.0.0.3");

memcpy(&(sin.sin_addr), host->h_addr,host->h_length);
sin.sin_family = host->h_addrtype;
sin.sin_port = htons(4000);

s = socket(AF_INET, SOCK_STREAM, 0);
connect(s, (struct sockaddr*)&sin, sizeof(sin));

while(1){//this is the Client sequence:
send(s, buffer, strlen(buffer), 0);//but what if the Server sends first ?? Client needs to receive here first
recv(s, buffer, sizeof(buffer), 0);
}
close(s);
}

最佳答案

套接字是双向的。它可以随时读取和写入。如果您想编写一个决定何时读取和何时写入的例程,则需要使用 select() 函数。它会告诉您套接字何时有数据可供读取,以及套接字何时可以接受要发送的数据。如果套接字在您有数据要发送之前接收到数据,您的例程可以检测到并执行“接收/发送”操作。如果您在套接字接收数据之前有数据要发送,您的例程可以检测到并执行“发送/接收”操作。例如:

while (1)
{
fd_set fd;
FD_ZERO(&fd);
FD_SET(s, &fd);

timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;

int ret;

if (select(s+1, &fd, NULL, NULL, &tv) > 0)
{
ret = recv(s, buffer, sizeof(buffer), 0);
if (ret > 0)
send(s, buffer, ret, 0);
}
else
{
ret = send(s, buffer, strlen(buffer), 0);
if (ret > 0)
recv(s, buffer, ret, 0);
}
}

关于c - 我如何设置套接字来执行 "send/receive"或 "receive/send",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10359332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com