UNP1------chp5
这一章以一个TCP/IP的实例来给我们讲解一些socket函数和重要的概念
服务器端:
#include <stdio.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#define SERVERPORT 8077
#define BUFFSIZE 1024
size_t sockaddr_size = sizeof(struct sockaddr);
char buf[BUFFSIZE];
void str_echo(int sockfd)
{
ssize_t n;
while(1)
{
while( (n = read(sockfd, buf, BUFFSIZE)) > 0)
write(sockfd, buf, n);
if(n < 0 && errno == EINTR)
continue;
else if(n < 0)
fprintf(stderr,"read error\n");
else
return;
}
}
int main(void)
{
//initialization8
struct sockaddr_in addr_server, addr_client;
int fd_server, fd_connect, x;
pid_t childpid;
if((x = fd_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
printf("socket error\n");//this sentence should be paied attention
memset(&addr_server, 0, sizeof(struct sockaddr_in));
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(SERVERPORT);
addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
if((x = bind(fd_server, (struct sockaddr*) &addr_server,sockaddr_size)) < 0)
printf("bind error\n");
if((x = listen(fd_server, 5)) < 0)
printf("listen error\n");
for(; ; )
{
fd_connect = accept(fd_server, (struct sockaddr*)&addr_server, &sockaddr_size);
if( (childpid = fork()) == 0)
{
close(fd_server);
str_echo(fd_connect);
exit(0);
}
close(fd_connect);
}
return 0;
}
客户端:
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#define SERVERPORT 8077
#define BUFFSIZE 1024
size_t sockaddr_size = sizeof(struct sockaddr);
char buf[BUFFSIZE];
void str_cli(FILE *fp, int sockfd)
{
char sendline[BUFFSIZE], recvline[BUFFSIZE];
while(fgets(sendline, BUFFSIZE,fp) != NULL)
{
write(sockfd, sendline, strlen(sendline));
if(read(sockfd, recvline, 1024) == 0)
printf("server terminated\n");
fputs(recvline, stdout);
}
}
int main(int argc, char **argv)
{
struct sockaddr_in addr_server;
int fd_client, x;
if((x = fd_client = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
printf("socket error\n");
memset(&addr_server, 0, sockaddr_size);
addr_server.sin_family = AF_INET;
inet_pton(AF_INET, argv[1], &addr_server.sin_addr);
addr_server.sin_port = htons(SERVERPORT);//the same as server?
if((x = connect(fd_client, (struct sockaddr*) &addr_server, sockaddr_size)) < 0)
printf("connect error\n");
str_cli(stdin, fd_client);
close(fd_client);
return 0;
}
这里有一个重要的问题,我遇到了,在设定端口的时候,不能够设定为8000,不知道是问什么,而且,8080是http端口
记住两个查询当前连接的命令:
netstat -a
ps -t pts/6 -o pid,ppid,tty,stat,args,wchan
书上给我们分析了TCP断开连接的过程,我的理解是四次握手的过程体现在客户端和服务器关闭套节字的时候发生,最后客户端套节字进入TIME_WAIT state,服务器端的子进程进入僵尸状态---Z标志
服务器端:
#include <stdio.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#define SERVERPORT 8077
#define BUFFSIZE 1024
size_t sockaddr_size = sizeof(struct sockaddr);
char buf[BUFFSIZE];
void str_echo(int sockfd)
{
ssize_t n;
while(1)
{
while( (n = read(sockfd, buf, BUFFSIZE)) > 0)
write(sockfd, buf, n);
if(n < 0 && errno == EINTR)
continue;
else if(n < 0)
fprintf(stderr,"read error\n");
else
return;
}
}
int main(void)
{
//initialization8
struct sockaddr_in addr_server, addr_client;
int fd_server, fd_connect, x;
pid_t childpid;
if((x = fd_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
printf("socket error\n");//this sentence should be paied attention
memset(&addr_server, 0, sizeof(struct sockaddr_in));
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(SERVERPORT);
addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
if((x = bind(fd_server, (struct sockaddr*) &addr_server,sockaddr_size)) < 0)
printf("bind error\n");
if((x = listen(fd_server, 5)) < 0)
printf("listen error\n");
for(; ; )
{
fd_connect = accept(fd_server, (struct sockaddr*)&addr_server, &sockaddr_size);
if( (childpid = fork()) == 0)
{
close(fd_server);
str_echo(fd_connect);
exit(0);
}
close(fd_connect);
}
return 0;
}
客户端:
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#define SERVERPORT 8077
#define BUFFSIZE 1024
size_t sockaddr_size = sizeof(struct sockaddr);
char buf[BUFFSIZE];
void str_cli(FILE *fp, int sockfd)
{
char sendline[BUFFSIZE], recvline[BUFFSIZE];
while(fgets(sendline, BUFFSIZE,fp) != NULL)
{
write(sockfd, sendline, strlen(sendline));
if(read(sockfd, recvline, 1024) == 0)
printf("server terminated\n");
fputs(recvline, stdout);
}
}
int main(int argc, char **argv)
{
struct sockaddr_in addr_server;
int fd_client, x;
if((x = fd_client = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
printf("socket error\n");
memset(&addr_server, 0, sockaddr_size);
addr_server.sin_family = AF_INET;
inet_pton(AF_INET, argv[1], &addr_server.sin_addr);
addr_server.sin_port = htons(SERVERPORT);//the same as server?
if((x = connect(fd_client, (struct sockaddr*) &addr_server, sockaddr_size)) < 0)
printf("connect error\n");
str_cli(stdin, fd_client);
close(fd_client);
return 0;
}
这里有一个重要的问题,我遇到了,在设定端口的时候,不能够设定为8000,不知道是问什么,而且,8080是http端口
记住两个查询当前连接的命令:
netstat -a
ps -t pts/6 -o pid,ppid,tty,stat,args,wchan
书上给我们分析了TCP断开连接的过程,我的理解是四次握手的过程体现在客户端和服务器关闭套节字的时候发生,最后客户端套节字进入TIME_WAIT state,服务器端的子进程进入僵尸状态---Z标志