Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在UDP套接字中使用memset函数_Sockets_Server_Udp_Memset - Fatal编程技术网

Sockets 在UDP套接字中使用memset函数

Sockets 在UDP套接字中使用memset函数,sockets,server,udp,memset,Sockets,Server,Udp,Memset,我有一个UDP套接字,我的客户端向服务器发送一个整数数组,服务器接收它并将其存储为变量。这是在一个无限循环中发生的。我没有在服务器端使用任何memset函数进行缓冲。 我检查了服务器端的结果,所有内容都正确接收 我想知道是否有必要在我有recvfrom()函数的每次迭代中使用memset 服务器代码: #define BUFSIZE 10 #define SERVERPORT "9090" int main(int argc, char **argv) { struct soc

我有一个UDP套接字,我的客户端向服务器发送一个整数数组,服务器接收它并将其存储为变量。这是在一个无限循环中发生的。我没有在服务器端使用任何memset函数进行缓冲。 我检查了服务器端的结果,所有内容都正确接收

我想知道是否有必要在我有recvfrom()函数的每次迭代中使用memset

服务器代码:

#define BUFSIZE     10
#define SERVERPORT    "9090" 
int main(int argc, char **argv) 
{
struct sockaddr_in serveraddr4; /* server's addr */
struct sockaddr_in clientaddr4; /* client addr */
struct hostent *hostp4; /* client host info */
int sockfd4; /* socket */
int portno4; /* port to listen on */
socklen_t clientlen4;
char *hostaddrp4; /* dotted decimal host addr string */
int optval4; /* flag value for setsockopt */
int n4; /* message byte size */
sockfd4 = socket(AF_INET, SOCK_DGRAM, 0);
portno4 = atoi("8080");
optval4 = 1;
setsockopt(sockfd4, SOL_SOCKET, SO_REUSEADDR,(const void *)&optval4 , sizeof(int));
bzero((char *) &serveraddr4, sizeof(serveraddr4));
serveraddr4.sin_family = AF_INET;
serveraddr4.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr4.sin_port = htons((unsigned short)portno4);
int b4=bind(sockfd4, (struct sockaddr *) &serveraddr4, sizeof(serveraddr4));
clientlen4 = sizeof(clientaddr4);
int buf4[BUFSIZE];

int A;
int B;
int buf4[BUFSIZE];


while(1)
{

    int n4 = recvfrom(sockfd4, buf4, BUFSIZE, 0,(struct sockaddr *) &clientaddr4, &clientlen4);
    A=buf4[0];B=buf4[1];
    cout<<A<<"  "<<B<<endl;

}
} 
#定义BUFSIZE 10
#定义服务器端口“9090”
int main(int argc,字符**argv)
{
serveraddr4;/*服务器的addr中的struct sockaddr_*/
clientaddr4;/*客户端地址中的结构sockaddr_*/
结构hostent*hostp4;/*客户端主机信息*/
int sockfd4;/*插座*/
int-portno4;/*要侦听的端口*/
socklen_t客户4;
char*hostaddrp4;/*点十进制主机地址字符串*/
setsockopt的int optval4;/*标志值*/
int n4;/*消息字节大小*/
sockfd4=插座(AF_INET,SOCK_DGRAM,0);
portno4=atoi(“8080”);
optval4=1;
setsockopt(sockfd4,SOL_SOCKET,SO_REUSEADDR,(const void*)和optval4,sizeof(int));
bzero((char*)&serveraddr4,sizeof(serveraddr4));
serveraddr4.sin_family=AF_INET;
serveraddr4.sin\u addr.s\u addr=htonl(INADDR\u ANY);
serveraddr4.sinu port=htons((无符号短)端口号4);
int b4=bind(sockfd4,(struct sockaddr*)和serveraddr4,sizeof(serveraddr4));
clientlen4=sizeof(clientaddr4);
int buf4[BUFSIZE];
INTA;
int B;
int buf4[BUFSIZE];
而(1)
{
int n4=recvfrom(sockfd4,buf4,BUFSIZE,0,(struct sockaddr*)和clientaddr4,以及clientlen4);
A=buf4[0];B=buf4[1];

coutNo,这是不必要的。如果要将其打印为字符串,可以执行
buff4[n4]=0;
(在测试n4>=0之后)@wildplasser:谢谢!不,我不想把它打印成字符串…但是打印的问题是我看到的所有代码都在循环中使用memset作为缓冲区吗?我的意思是,如果一个数组将在下一次迭代中被覆盖,为什么我们要在接收之前将它全部设置为NULL?不,这只是一种糟糕的风格。错误的防御程序相反,请始终检查从read()、write()recvfrom()等处获得的返回值并使用它。(在您的情况下:n4可能是-1{暂时资源不足,(可能是)EAGAIN})@wildplasser如果要将其打印为字符串,则应使用
printf(“%s”,n4,buff4)
,而不是在可能不合适的地方粘贴空值。@EJP:当然,您是正确的。但是在UDP的情况下,使用足够大的缓冲区,或者对recvfrom()调用使用稍微减小的大小(第3个)参数并不是那么难。