c++ UDP服务器崩溃

C++ UDP server breakdown

本文关键字:崩溃 服务器 UDP c++      更新时间:2023-10-16

c++在网络中使用对我来说是完全神秘的。有人介意帮我分析一下这段代码中的错误吗?这是给我的班级作为一个例子,如何不做一个UDP服务器。

我已经注意到一些问题,比如缓冲区是一个固定的256字节长,但在大多数情况下我不理解它。我是一个PHP/Java/JavaScript程序员。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void error(char *msg)
{
    perror(msg);
    exit(1);
}
int main(int argc, char *argv[])
{
     int sockfd, portno, clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc <= 2) {
         fprintf(stderr,"Error, no port providedn");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("Error opening socket");
     bzero((char *) &cli_addr, sizeof(serv_addr));
     portno = atoi(argv[2]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(cli_addr)) < 0) 
              error("ERROR on binding");
     clilen = sizeof(cli_addr);
     while(100)
     {
        bzero(buffer,256);
        n = recvfrom(sockfd,buffer, 0, 255,
                 (struct sockaddr *) &serv_addr,&clilen);
        printf("A client from %s port %d connectedn", inet_aton(cli_addr.sin_addr), htons(cli_addr.sin_port));
        if (n < 0) error("Error reading from socket");
        printf("Here is the message: %sn",buffer);
        n = sendto(sockfd,"I got your message",18,0,(struct sockaddr *) &serv_addr,sizeof(cli_addr));
        if (n < 0) error("Error writing to socket");
     }
     close(sockfd);
     return 0; 
}

你试过吗?使用nc/aka netcat来尝试发送UDP数据包。

哦,这是来自socket()手册页的另一个线索

SOCK_STREAM     Provides sequenced, reliable, two-way, connection-based byte streams.   An  out-of-band data transmission mechanism may be supported
SOCK_DGRAM      Supports datagrams (connectionless, unreliable messages of a fixed maximum length).

你对缓冲区大小是正确的,虽然它不应该溢出-我会使用2^16也就是65536,因为这是IPv4中支持的最大UDP数据包

socket函数为服务器套接字创建套接字句柄。bind函数将套接字句柄绑定到指定的IP地址(INADDR_ANY)和端口(通过serv_addr)。在while循环中,它通过recvfrom函数从客户端接收数据并将数据打印出来。sendto函数将应答发送回客户端。close函数关闭套接字句柄