C ++ UDP服务器故障

时间:2011-10-31 02:15:24

标签: c++ udp

在网络中使用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 provided\n");
         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 connected\n", inet_aton(cli_addr.sin_addr), htons(cli_addr.sin_port));

        if (n < 0) error("Error reading from socket");
        printf("Here is the message: %s\n",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; 
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你试过吗?使用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数据包