tcp/IPポイントツーポイント通信プログラム
21053 ワード
ポイントツーポイント通信
サーバ側とクライアントは、接続が確立された後にプロセスを作成します.
サーバ側:
サブプロセスは、ホストの入力を受信し、データを送信するために使用されます.親プロセスは、クライアントのデータを受信してホストに出力するために使用されます.
サブプロセスはホストの入力を待機し、入力したデータは送信キャッシュ領域に配置されます.入力がある場合は、入力データをクライアントに送信し、送信バッファを空にします.次回の入力長さが今回より短い場合、バッファ内で今回受信した数の後の数が消去に反するため、これらのデータは今回のデータとともに送信されるからである.サーバがシャットダウンすると、サブプロセスは終了し、破棄されます.
親プロセスはクライアントのデータを受信するのを待っています.受信したデータの数が0、すなわちクライアントが閉じると、親プロセスはwhileループを終了し、プロセスを破棄します.受信したデータが0より大きい場合、受信したデータはホストに出力されます.
クライアント:
サブプロセスは、サーバのデータを受信してホストに出力するために使用されます.親プロセスは、ホストから入力されたデータを受信してサーバに送信するために使用されます.
転載先:https://www.cnblogs.com/wujing-hubei/p/5539676.html
サーバ側とクライアントは、接続が確立された後にプロセスを作成します.
サーバ側:
サブプロセスは、ホストの入力を受信し、データを送信するために使用されます.親プロセスは、クライアントのデータを受信してホストに出力するために使用されます.
サブプロセスはホストの入力を待機し、入力したデータは送信キャッシュ領域に配置されます.入力がある場合は、入力データをクライアントに送信し、送信バッファを空にします.次回の入力長さが今回より短い場合、バッファ内で今回受信した数の後の数が消去に反するため、これらのデータは今回のデータとともに送信されるからである.サーバがシャットダウンすると、サブプロセスは終了し、破棄されます.
親プロセスはクライアントのデータを受信するのを待っています.受信したデータの数が0、すなわちクライアントが閉じると、親プロセスはwhileループを終了し、プロセスを破棄します.受信したデータが0より大きい場合、受信したデータはホストに出力されます.
#include
#include
#include
#include<string.h>
#include
#include
#include
#include //* */
#includein.h>
#include
#define MAXLINE 50 //
int main()
{
int sock_fd,new_fd;//sock_fd ,new_fd
struct sockaddr_in srv_addr;//
struct sockaddr_in client_addr;//
int size; //
pid_t pid; // id
ssize_t n;
char buf[MAXLINE]; //
/* */
sock_fd=socket(AF_INET,SOCK_STREAM,0);// IPv4
if(sock_fd==-1)
{
perror("creat socket failed");
exit(1);
}
/* */
srv_addr.sin_family=AF_INET;
srv_addr.sin_port=htons(3490);
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&srv_addr.sin_zero,sizeof(struct sockaddr_in));//bzero , sin_zero ,sin_zero ,
int on=1; // reuseaddr
if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0) // 、
perror("setsockopt");
/* */
if(bind(sock_fd,(struct sockaddr*)&srv_addr,sizeof(struct sockaddr))==-1)
{
perror("bind failed");
exit(1);
}
/*
if(connect(sock_fd,(struct sockaddr*)&srv_addr,sizeof(sock_fd))==-1)
{
perror("bind failed");
exit(1);
}*/
/* , */
if((listen(sock_fd,5))==-1)
{
perror("listen failed");
exit(1);
}
/* , accep*/
//while(1)
//{
size=sizeof(struct sockaddr_in);
new_fd=accept(sock_fd,(struct sockaddr*)&client_addr,&size);
if(new_fd==-1)
{
perror("accept failed");
//continue;//restart accept when EINTR
}
printf("server:got connection from IP= %s prot= %d
",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));// , IP
/*char *inet_nota(struct sockaddr_in in);
:
arpa/inet.h
Winsock2.h
:
IP
:
, , IP ( ); , NULL。
uint31_t ntohs(uint32_t net32bitvalue);
:
#include
net32bitvalue 。
*/
if(send(new_fd,"Hello client,I am 192.168.229.125!
",50,0)==-1) //192.168.229.125 IP,
perror("send failed");
pid=fork(); // ,
if(pid<0)
perror("fork error
");
if(!pid)// ,
{
// close(sock_fd);// ,
while(fgets(buf,sizeof(buf),stdin)!=NULL)
{
write(new_fd,buf,strlen(buf));
memset(buf,0,sizeof(buf)); // ,
// exit(EXIT_SUCCESS);
}
exit(EXIT_SUCCESS);
}
else //f=
{
char recvbuf[50];
//close(new_fd);// ,
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
n=read(new_fd,recvbuf,MAXLINE);
if(n==0)
{
printf("peer closed
");
break;
}
else if(n<0)
perror("read from client error");
fputs(recvbuf,stdout);
}
exit(EXIT_SUCCESS);
}
//while(waitpid(-1,NULL,WNOHANG)>0);// ,
//}
return 0;
}
クライアント:
サブプロセスは、サーバのデータを受信してホストに出力するために使用されます.親プロセスは、ホストから入力されたデータを受信してサーバに送信するために使用されます.
#include
#include
#include
#include<string.h>
#include
#include
#include
#include //* */
#includein.h>
#include
#define MAXBYTEMUN 50
int main(int argc,char *argv[])
{
int sock_fd,numbytes;
char buf[MAXBYTEMUN];
struct hostent *he;
struct sockaddr_in client_addr;//
ssize_t n;
if(argc!=2)
{
fprintf(stderr,"usage: client IPAddress
"); // , IP
exit(1);
}
/* */
sock_fd=socket(AF_INET,SOCK_STREAM,0);// IPv4
if(sock_fd==-1)
{
perror("creat socket failed");
exit(1);
}
/* */
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(3490);
client_addr.sin_addr.s_addr=inet_addr(argv[1]);
bzero(&client_addr.sin_zero,sizeof(struct sockaddr_in));//bzero , sin_zero ,sin_zero ,
/* */
if(connect(sock_fd,(struct sockaddr*)&client_addr,sizeof(struct sockaddr))==-1)
{
perror("connect failed");
exit(1);
}
if((numbytes=recv(sock_fd,buf,MAXBYTEMUN,0))==-1)
{
perror("receive failed");
exit(1);
}
buf[numbytes]='\0';// \0,
printf("Received: %s
",buf);
pid_t pid;
pid=fork();
if(!pid)// ,
{
char recvbuf[50];
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
n=read(sock_fd,recvbuf,MAXBYTEMUN);
if(n==0)
{
printf("peer closed
");
break;
}
else if(n<0)
perror("read from server error");
fputs(recvbuf,stdout);
}
//exit(EXIT_SUCCESS);
close(sock_fd);
}
else //f=
{
//close(sock_fd);// ,
while(fgets(buf,sizeof(buf),stdin)!=NULL)
{
write(sock_fd,buf,strlen(buf));
memset(buf,0,sizeof(buf)); // ,
// exit(EXIT_SUCCESS);
}
//exit(EXIT_SUCCESS);
close(sock_fd);
}
/*
if((numbytes=recv(sock_fd,buf,MAXBTYEMUN,0))==-1)
{
perror("receive failed");
exit(1);
}
buf[numbytes]='\0';// \0,
printf("Received: %s
",buf);
close(sock_fd);*/
return 0;
}
転載先:https://www.cnblogs.com/wujing-hubei/p/5539676.html