您的位置:首页 > 理论基础 > 计算机网络

TCp客户/服务器程序示例

2015-04-26 15:17 465 查看


1. TCP回射服务器程序:main函数

#include "unp.h"

int main(int argc, char **argv)

{

int listenfd, connfd;

pid_t childpid;

socklen_t clilen;

struct sockaddr_in cliaddr, servaddr;

listenfd = Socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(SERV_PORT);

Bind(listenfd, (SA*)& servaddr, sizeof(servaddr));

Listen(listenfd, LISTENQ);

for (;;)

{

clilen = sizeof(cliaddr);

connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);

if ((childpid = Fork()) == 0)

{

Close(listenfd);

str_echo(connfd);

exit(0);

}

Close(connfd);

}

}

2. TCP回射服务器程序:str_echo函数

str_echo函数执行处理每个客户的服务,从客户读入数据,并把他们回射给客户。

#include "unp.h"

void str_echo(int sockfd)

{

ssize_t n;

char buf[MAXLINE];

again:

while ((n = read(sockfd, buf, MAXLINE)) > 0)

Writen(sockfd, buf, n);

if (n < 0 && errno == EINTR)

goto again;

else if (n < 0)

err_sys("str_echo:read error");

}

read函数从套接字读入数据,writen函数把其中内容回射给客户,如果客户关闭连接(这是正常情况),那么接收到客户的FIN将导致服务器子进程的read函数返回0,这又导致str_echo函数的返回。从而终止子进程。

3. TCP回射客户程序

#include "unp.h"

int main(int argc, char** argv)

{

int sockfd;

struct sockaddr_in servaddr;

if (argc != 2)

err_eqit("usage:tcpcli<IPaddress>");

sockfd = Socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(SERV_PORT);

Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));

str_cli(stdin, sockfd);

exit(0);

}

3. TCP回射客户程序:str_cli函数

str_cli函数完成客户处理循环。从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射写到标准输出上。

#include "unp.h"

void str_cli(FILE* fp, int sockfd)

{

char sendline[MAXLINE], recvline[MAXLINE];

while (Fgets(sendline,MAXLINE,fp)!=NULL)

{

Writen(sockfd, sendline, strlen(sendline));

if (Readline(sockfd, recvline, MAXLINE) == 0)

err_quit("str_cli:server terminated prematurely");

Fputs(recvline, stdout);

}

}

读入一行,写到服务器

fgets读入一行文本,writen把该行发送给服务器。

从服务器读入回射行,写到标准输出

readline从服务器读入回射行,fputs把它写到标准输出。

返回main函数

当遇到文件结束符或错误时,fgets将返回一个空指针,于是客户处理循环终止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: