红联Linux门户
Linux帮助

linux网络编程

发布时间:2012-11-19 22:18:46来源:红联作者:fs940188589
/**
* a sample server
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 8888
#define BACKLOG 2

void process_conn_server(int sock);

int main(int argc, char **argv)
{
int sSock, cSock;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid;
sSock = socket(AF_INET, SOCK_STREAM, 0); //创建一个TCP套接字
if(-1 == sSock)
{
printf("Create socket error");
return -1;
}
bzero(&server_addr, sizeof(server_addr)); //初始化地址空间
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
err = bind(sSock, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(err < 0)
{
printf("bind error");
return -1;
}
printf("Bind program is right,it return %d\n",err);
err = listen(sSock, BACKLOG);
if(err < 0)
{
printf("listen error");
return -1;
}
printf("Listen program is right,it return %d\n",err);


for( ; ; )
{
// int addrlen = sizeof(struct sockaddr);
socklen_t addrlen = sizeof(struct sockaddr);
cSock = accept(sSock, (struct sockaddr*)&client_addr, &addrlen);
perror("The state is:");
pid = fork();
if(pid < 0)
{
printf("can't create new pid");
return -1;
}
if(pid == 0)
{
close(sSock);
process_conn_server(cSock);
exit(0);
}
else
close(cSock);
}
// return 0;
}
void process_conn_server(int sock)
{
ssize_t size = 0;
char buffer[1024];
char sendbuffer[25] = "Welcome to this server\n";
write(sock, sendbuffer, 25 );
for( ; ; )
{
size = read(sock, buffer, 1024); //当读到的字节位0,即发送方停止发送,就会返回
if(size == 0)
return;
// sprintf(buffer, "%d bytes altogether\n", (int)size);
write(sock, buffer, strlen(buffer) +1 );
write(STDOUT_FILENO, buffer, strlen(buffer) +1 );
}
}


/*
* client.c
* a sample client for server
*/
#include
//#include
#include
#include
//#include
//#include
#include
#include
#include

#define PORT 8888
void process_conn_client(int s);

int main(int argc, char *argv[])
{
int s;
if(argc != 2 )
{
printf("client \n");
return -1;
}
struct sockaddr_in server_addr;
s = socket(AF_INET, SOCK_STREAM, 0);
if(s < 0)
{
printf("failed to creating socket");
return -1;
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
int cnum = connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)); //成功则返回0,否则为-1
if(cnum < 0)
{
printf("can't find the servers\n");
return 0;
}
process_conn_client(s);
exit(0);
}

void process_conn_client(int s)
{

ssize_t size = 0;
char buffer[1024];
char recvbuffer[25];
read(s, recvbuffer, 25 );
write(STDOUT_FILENO, recvbuffer, strlen(recvbuffer) +1 );
for( ; ; )
{
//buffer[1024] = {''};
size = read(0, buffer, 1024); //将标准输入读到buffer中,此处,要有个初始化
if(size > 0)
write(s, buffer, strlen(buffer) +1 );
// printf(buffer);
write(STDOUT_FILENO, buffer, strlen(buffer) +1 );
}
}


服务端和客户端代码如上所示,当两者建立连接后,客户端断开,本来应该是4次分手的,但是我用wireshark抓包,却只抓到三个,向大家求解啊!
文章评论

共有 4 条评论

  1. zyg376319314 于 2013-06-06 09:39:34发表:

    正在找相关书籍,thx

  2. lufang230 于 2012-11-23 14:56:27发表:

    谢谢分享

  3. fs940188589 于 2012-11-19 22:24:17发表:

    测试了一下,貌似是没有加上对子进程信号结束时候的处理函数,但是还是不明白为什么啊?

  4. fs940188589 于 2012-11-19 22:23:35发表:

    测试了一下,貌似是没有加上对子进程信号结束时候的处理函数,但是还是不明白为什么啊?