服务端程序
>#include <stdio.h>
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if ( sockfd < 0 )
printf("socketfd err\n");
struct sockaddr_in listenaddr;
bzero( &listenaddr, sizeof(listenaddr));
listenaddr.sin_family = AF_INET;
listenaddr.sin_addr.s_addr = htonl(INADDR_ANY);
listenaddr.sin_port = htons(2019);
if ( bind( sockfd, (struct sockaddr*)&listenaddr, sizeof(listenaddr) ) < 0 )
printf("bind fail\n");
if ( listen( sockfd, 3 ) < 0 )
printf("listen fail\n");
pid_t pid;
while(true)
{
struct sockaddr_in connaddr;
socklen_t nLen = sizeof(connaddr);
//取三次握手成功的连接
int connfd = accept( sockfd, (struct sockaddr*)&connaddr, &nLen);
if ( connfd < 0 )
{
printf("accept error\n");
}
//打印握手成功的客户端
struct sockaddr_in servaddr;
socklen_t nServLen = sizeof(servaddr);
getsockname( sockfd, (struct sockaddr*)&servaddr, &nServLen);
char buf[128];
inet_ntop(AF_INET, &servaddr.sin_addr, buf, sizeof(buf));
printf("servip = %s, servPort = %d\n", buf, ntohs(servaddr.sin_port) );
inet_ntop(AF_INET, &connaddr.sin_addr, buf, sizeof(buf));
printf("clinip = %s, clinPort = %d\n", buf, ntohs(connaddr.sin_port) );
//每个连接都开一个子进程
pid = fork();
if ( pid == 0 )
{
close(sockfd);//在子进程中关闭监听套接字,最终监听套接字的关闭由父进程决定
struct sockaddr_in addr;
socklen_t addr_len = sizeof(addr);
while(true)
{
char buf[256];
int len = recv (connfd, buf, 256, 0);
if ( len <= 0 )
break;
printf("recv %s[%d] from %d\n", buf, getpid(), ntohs(connaddr.sin_port));
}
printf("exit fork\n");
exit(0);
}
close(connfd);//在父进程中关闭连接套接字,最终套接字的关闭由子进程决定
//break;
}
return 0;
}
客户端程序
#include <stdio.h>
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if ( sockfd < 0 )
printf("socketfd err\n");
struct sockaddr_in connaddr;
socklen_t nLen = sizeof(connaddr);
connaddr.sin_family = AF_INET;
connaddr.sin_port = htons(2019);
inet_pton(AF_INET, "10.0.2.15", &connaddr.sin_addr);
if ( connect(sockfd, (struct sockaddr*)&connaddr, sizeof(connaddr) ) < 0 )
printf("conn fail\n");
struct sockaddr_in clientaddr;
nLen = sizeof(clientaddr);
getsockname(sockfd, (struct sockaddr*)&clientaddr, &nLen);
char buf[128];
inet_ntop(AF_INET, &clientaddr.sin_addr, buf, sizeof(buf));
printf("clientip = %s, clientPort = %d\n", buf, ntohs(clientaddr.sin_port) );
struct sockaddr_in serveraddr;
nLen = sizeof(serveraddr);
getpeername(sockfd, (struct sockaddr*)&serveraddr, &nLen);
printf("serverip = %s, serverPort = %d\n", buf, ntohs(serveraddr.sin_port) );
while(true)
{
sendto (sockfd, "111111", 10, MSG_TRUNC, (sockaddr*)&connaddr, sizeof(connaddr));
//sendto(sockfd, "11111", 4);
printf("send data, port = %d\n", ntohs(clientaddr.sin_port));
sleep(1);
}
return 0;
}