サーバ側(mytcpsv.c)
#include <stdio.h>
#include <signal.h>
#include "tcp_lib.h"
void do_tcpsv(int port);
int main(int argc,char* argv[])
{
int pid,port = 7;
printf("\n<q Enter>: end of program\n\n");
if((pid = fork()) < 0){
perror("fork"); exit(1);
}
if(pid == 0){
do_tcpsv(port); exit(0);
} else {
while(getchar()!='q') ;
kill(pid,SIGINT);
}
printf("end of TCP server.\n");
return 0;
}
void do_tcpsv(int port)
{
int acc,sock,sbyte;
char clhost[256];
BYTE recvcom[BUFSIZ];
struct sigaction sa;
void myendsv(int no) {
if(sock > 0) TCP_close(sock);
exit(0);
}
memset(&sa,0,sizeof(struct sigaction));
sa.sa_handler = myendsv;
if(sigaction(SIGINT,&sa,NULL) != 0){
perror("sigaction");
return;
}
if((acc = TCP_acc_port(port)) < 0)
return;
Disp_ipinfo("echo server",port);
sock = -1;
while(1){
sock = TCP_accept(acc,clhost);
if(sock < 0){
perror("accept"); continue;
}
printf("**new client: [%s]\n",clhost);
while((sbyte = TCP_recv(sock,recvcom,0)) > 0){
printf("recbuf = %s[%d byte]\n",(char*)recvcom,sbyte);
TCP_send(sock,recvcom,sbyte);
}
printf("**client disconnected.\n");
TCP_close(sock);
sock = -1;
}
return;
}
|
実行結果
Gami[30]% ./mytcpsv.exe
<q Enter>: end of program
** echo server
medlanc[219.61.76.47]: 7
**new client: [127.0.0.1] --> mytcpcl.exe からの接続
recbuf = send data.[10 byte]
**client disconnected.
**new client: [127.0.0.1] --> echo_cl.exe からの接続
recbuf = sending data.
[14 byte]
recbuf = test of echo server.
[21 byte]
recbuf = end of transmission.
[21 byte]
**client disconnected.
q
end of TCP server.
Gami[31]%
|
|
| |
クライアント側(mytcpcl.c)
#include <stdio.h>
#include "tcp_lib.h"
int main(int argc,char* argv[])
{
int rbyte,sock,portno;
char *server,recbuf[BUFSIZ];
if(argc != 3) {
printf("Usage: %s host port\n",argv[0]); return 0;
}
server = argv[1]; portno = atoi(argv[2]);
if((sock = TCP_open(server,portno)) < 0){
return 0;
}
TCP_send(sock,"send data.",strlen("send data."));
rbyte = TCP_recv(sock,recbuf,0);
printf("received: [%s]\n",recbuf);
TCP_close(sock);
return 0;
}
|
実行結果
Gami[549]% ./mytcpcl.exe localhost 7
localhost: Connection refused --> echo サーバの起動前
Gami[550]% ./mytcpcl.exe localhost 7
received: [send data.]
Gami[551]%
|
echoクライアント側(echo_cl.c)
#include <stdio.h>
#include "tcp_lib.h"
int echo_client(char *server,int portno);
int main(int argc, char *argv[])
{
int portno;
char *server;
if(argc != 3) {
fprintf(stdout,"Usage: %s host port\n",argv[0]);
return 0;
}
server = argv[1];
portno = atoi(argv[2]);
echo_client(server,portno);
return 0;
}
int echo_client(char *server, int portno)
{
int sock;
BYTE sbuf[BUFSIZ],rbuf[BUFSIZ];
FILE *in,*out;
if((sock = TCP_open(server,portno)) < 0) { exit(1); }
if(fdopen_sock(sock,&in,&out) < 0) { exit(1); }
printf("==> "); fflush(stdout);
while(fgets(sbuf,BUFSIZ,stdin)) {
fprintf(stdout,"sending: [%s]\n",sbuf);
fprintf(out,"%s",sbuf);
fgets(rbuf,BUFSIZ,in);
printf("received: [%s]\n",rbuf);
printf("==> "); fflush(stdout);
strcpy(rbuf,"");
}
printf("\n");
fclose(in);
fclose(out);
return 0;
}
|
実行結果
Gami[551]% ./echo_cl.exe localhost 7
==> sending data.
sending: [sending data.
]
received: [sending data.
]
==> test of echo server.
sending: [test of echo server.
]
received: [test of echo server.
]
==> end of transmission.
sending: [end of transmission.
]
received: [end of transmission.
]
==>
Gami[552]%
|
|
|