//serv.c
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <getopt.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#include <poll.h>
#include <signal.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
FILE *log;
int port_no;
struct sockaddr_in server_addr;
struct hostent* server; int port_flag=0;
int c;
while(1)
{
static struct option long_options[]=
{
{"port",required_argument,0,'p'},
{"log",required_argument,0,'l'},
};
c= getopt_long(argc,argv,"p:l",long_options,NULL);
if(c==-1)
break;
switch(c)
{
case 'l':
if(optarg)
{
if(optarg[0]!='-')
{
log= fopen(optarg,"w");
}
else
{
fprintf(stderr,"log requires argument\n");
}
}
break;
case 'p':
if(optarg)
{
if(optarg[0]!='-')
{
port_no= atoi(optarg);
port_flag=1;
}
else{
printf("Usage --port=PORT_NUMBER\n");
}
}
else
{
printf("Usage --port=PORT_NUMBER\n");
}
break;
case '?':
write(STDOUT_FILENO,"\r",1);
exit(1);
break;
default:
break;
}
}
int opt = 0, port_num, client_len;
struct sockaddr_in server_addr, client_addr;
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd < 0) { perror("Error opening socket"); exit(1); }
memset((char*) &server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port_num);
server_addr.sin_addr.s_addr = INADDR_ANY;
if(bind(socket_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0)
{
perror("Error binding socket");
exit(1);
}
listen(socket_fd,5);
client_len=sizeof(client_addr);
newsocket_fd=accept(socket_fd,(struct sockaddr *)&client_addr,&client_len);
printf("accepting");
if(newsocket_fd<0)
{
fprintf(stderr,"error on accept");
}
char buffer[256];
memset(buffer,0,256);
int n=read(newsocket_fd,buffer,255);
if(n<0)
{
fprintf(stderr,"Error reading from socket");
}
printf("Here is the message: %s\n",buffer);
n=write(newsocket_fd,"I got your message",18);
}
いるclient.c私は理由を知りませんが、サーバーがからソケット の接続を受け入れていないような接続
int main(int argc, char *argv[])
{
FILE *log;
int port_no;
struct sockaddr_in server_addr;
struct hostent* server; int port_flag=0;
int c;
while(1)
{
static struct option long_options[]=
{
{"port",required_argument,0,'p'},
{"log",required_argument,0,'l'},
};
c= getopt_long(argc,argv,"p:l",long_options,NULL);
if(c==-1)
break;
switch(c)
{
case 'l':
if(optarg)
{
if(optarg[0]!='-')
{
log= fopen(optarg,"w");
}
else
{
fprintf(stderr,"log requires argument\n");
}
}
break;
case 'p':
if(optarg)
{
if(optarg[0]!='-')
{
port_no= atoi(optarg);
port_flag=1;
}
else{
printf("Usage --port=PORT_NUMBER\n");
}
}
else
{
printf("Usage --port=PORT_NUMBER\n");
}
break;
case '?':
write(STDOUT_FILENO,"\r",1);
exit(1);
break;
default:
break;
}
}
char buffer[256];
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd < 0) { perror("Error opening socket"); exit(0); }
server = gethostbyname("localhost");
if(server == NULL) { fprintf(stderr, "Cannot find host"); exit(0); }
//Initialize the server address to zero and then correctly assign it
memset((char*) &server_addr,0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
memcpy((char *) &server_addr.sin_addr.s_addr,
(char*) server->h_addr,
server->h_length);
server_addr.sin_port = htons(port_no);
if(connect(socket_fd,(struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { perror("Error connecting"); exit(0); }
printf("Please enter the message");
memset(buffer,0,256);
fgets(buffer,255,stdin);
int n=write(socket_fd,buffer,strlen(buffer));
if(n<0)
{
fprintf(stderr,"error writing to socket");
}
memset(buffer,0,256);
n=read(socket_fd,buffer,255);
if(n<0)
{
printf("Error reading");
}
printf("%s\n",buffer);}
}
を受け入れるように見えるローカルホストdoesntの上のサーバークライアント。私は1024以上のポート番号を試しました。ただ は機能しません。ポート番号はユーザーが入力したものです。それが動作するport_noだけがありますか?
あなたはどのようなエラーを得るか、そしてどこから? –
エラーが発生しても、接続が確立されるまでハングし続けることはありません –
テストで使用したACTUALコードはserv.cのport_numが初期化されていないと仮定します...まず "serv" "..."掛かった "... ... ??? – TonyB