【发布时间】:2017-02-07 05:06:59
【问题描述】:
我像这样在我的 udp 套接字客户端调用 sendto:
if((num_w = sendto(cli_udp_sock, buffer, strlen(buffer), 0, (struct sockaddr *) &servaddr, sizeof(servaddr) )) < 0)
但在服务器端似乎没有收到任何内容,并且以非常奇怪的方式,num_w 在打印出来时给出如下值:
-197379208 -1440076936 2054978424
并且 perror() 显示“成功”
到目前为止的客户端代码:
#include <sys/socket.h> /* socket definitions */
#include <sys/types.h> /* socket types */
#include <arpa/inet.h> /* inet (3) funtions */
#include <unistd.h> /* misc. UNIX functions */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
/* Global constants */
#define MAX_LINE (1000)
#define LISTENQ (10)
/* Function declarations */
int ParseCmdLine(int argc, char *argv[], char **szPort, char **szAddress, char ** serv_udp_port);
/* main() */
int main(int argc, char *argv[]) {
//
short int cli_port; /* port number */
short int serv_port;
struct sockaddr_in servaddr; /* socket address structure */
socklen_t serv_addrlen = sizeof(servaddr);
struct sockaddr_in cliaddr;
char buffer[MAX_LINE]; /* character buffer */
char *szAddress; /* Holds remote IP address */
char *szPort; /* Holds remote port */
char *serv_udp_port;
char *endptr; /* for strtol() */
int cli_udp_sock;
/* Get command line arguments */
ParseCmdLine(argc, argv, &szPort, &szAddress, &serv_udp_port);
/* Set the remote port */
cli_port = strtol(szPort, &endptr, 0);
serv_port = strtol(serv_udp_port, &endptr, 0);
if ( *endptr )
{
printf("ECHOCLNT: Invalid port supplied.\n");
exit(EXIT_FAILURE);
}
/* Set all bytes in socket address structure to zero, and fill in the relevant data members */
memset(&cliaddr, 0, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(cli_port);
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(serv_port);
/* Set the remote IP address */
if ( inet_aton(argv[2], &servaddr.sin_addr) <= 0 )
{
printf("ECHOCLNT: Invalid remote IP address.\n");
exit(EXIT_FAILURE);
}
int list_s;
if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
fprintf(stderr, "ECHOCLNT: Error creating listening socket.\n");
exit(EXIT_FAILURE);
}
if (listen(list_s, LISTENQ) < 0)
{
printf("Failed to called listen.\n");
}
if( ((cli_udp_sock = socket(AF_INET, SOCK_DGRAM, 0) )< 0))
{
printf("UDP socket was not successfully created. Exiting...\n");
exit(0);
}
//if(bind(cli_udp_sock, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) > 0);
char command[100];
/* Get command from user */
printf("==============================================\n");
do
{
if(strcmp(command, "s\n") == 0)
{
printf("______________________________________________\n");
printf("'s' entered, \nEnter the string to request\n"); //prompt for string to enter
strcpy(buffer, "CAP\n"); //set first set of characteres to CAP\n
char bucket[100]; //space for entered string
fgets(bucket, sizeof bucket, stdin);
printf("The string entered is: %s", bucket);
strcat(buffer, bucket);
/* Send string to echo server, and retrieve response */
int num_w;
if((num_w = sendto(cli_udp_sock, buffer, strlen(buffer), 0, (struct sockaddr *) &servaddr, sizeof(servaddr) )) < 0)
{
perror("error: ");
printf("Problem writing data to server, errno: %d", errno);
exit(0);
}
else
{
perror("error 2: ");
printf("num_w: %d\n");
}
提前非常感谢! (哦,我在 Kali linux、虚拟机、Windows 10 上)
【问题讨论】: