C 如何设置套接字以执行以下任一操作;“发送/接收”;或;“接收/发送”;
如果数据从另一台计算机“发送”(第一台),如何将套接字例程设置为“发送”(第一台)或(切换)为“接收” 谢谢 一般代码:C 如何设置套接字以执行以下任一操作;“发送/接收”;或;“接收/发送”;,c,sockets,C,Sockets,如果数据从另一台计算机“发送”(第一台),如何将套接字例程设置为“发送”(第一台)或(切换)为“接收” 谢谢 一般代码: -(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_
-(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()
系统调用来处理多个套接字,并在数据可用于读取或写入时触发操作。互联网上充斥着关于socket编程的一般信息,可能是start,其中包括一些指向其他好信息的链接
还有
几乎任何关于网络编程的书都应该有一些很好的例子。您可以使用
select()
系统调用来处理多个套接字,并在数据可用于读写时触发操作。互联网上充斥着关于socket编程的一般信息,可能是start,其中包括一些指向其他好信息的链接
还有
几乎任何关于网络编程的书都应该有一些很好的例子。套接字是双向的。它可以在任何时候读取和写入。如果要编写一个例程来决定何时读取和何时写入,则需要使用
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);
}
}
插座是双向的。它可以在任何时候读取和写入。如果要编写一个例程来决定何时读取和何时写入,则需要使用
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);
}
}
是否需要设置取消阻止?否,
select()
可用于阻止和非阻止套接字。是否需要设置取消阻止?否,select()
可用于阻止和非阻止套接字。