我使用linux上的posix套接字api在c中编写了一个客户端应用程序,它将信息发送到服务器,然后将其打印到服务器终端窗口。如果服务器与客户端在同一台机器上,并且客户端发送到环回或其自己的IP地址,那么一切都很好。但是,如果服务器在另一台计算机上运行,则sendto会返回“无效参数”错误。
以下是客户端应用程序的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "utils.h" // for 'errexit()'
#define PEER_PORT 54321
#define BUFFSIZE 100
#define local_net_ip "192.168.0.10"
int main( int argc, char *argv[] )
{
int clientfd;
clientfd = socket( AF_INET, SOCK_DGRAM, 0 );
if( clientfd == -1 )
errexit( "socket()" );
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons( PEER_PORT );
if( inet_pton( AF_INET, local_net_ip, (void *) &(servaddr.sin_addr) ) == -1 )
errexit( "inet_pton()" );
char addrStr[ INET_ADDRSTRLEN ];
inet_ntop( servaddr.sin_family, &(servaddr.sin_addr), addrStr, INET_ADDRSTRLEN );
printf("Server IPv4 addr: [ %s ]\n", addrStr);
char buff[ BUFFSIZE ];
int writebytes;
for( ;; ) {
printf( "Enter text: ");
fgets( buff, BUFFSIZE, stdin );
writebytes = sendto( clientfd, buff, BUFFSIZE, 0, (struct sockaddr *) &servaddr, sizeof( struct sockaddr_in ) );
if( writebytes == -1 )
errexit( "sendto()" );
}
exit( EXIT_SUCCESS );
}
我非常感谢有关应用程序无法发送到另一台计算机的任何信息!在此先感谢!!
答案 0 :(得分:1)
clientfd = socket(AF_INET,SOCK_DGRAM,0);
您正在创建一个协议为0的套接字,例如IP。但是后来你使用和IP:端口作为目标。你可能想在这里使用UDP套接字(原型17)。