网络编程—TCP
来源:互联网 发布:java DES秘钥加解密 编辑:程序博客网 时间:2024/05/24 04:36
/*******************************************************/
网络基础编程
/*******************************************************/
//common.h头文件
#ifndef __COMMON_H__
#define __COMMON_H__ //定义头文件common.h
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <error.h>
#include <arpa/inet.h>
#include <strings.h>
#include <netinet/in.h> //包含的头文件
#define Err_sys(info) / //定义错误处理函数
{ fprintf(stderr, "%s %s/n", info, strerror(errno)); /
exit(EXIT_FAILURE); /
}
#define addrsize sizeof(struct sockaddr_in) //套接字信息sockaddr_in结构体的大小
#define port 8888 //端口号
#define backlog 10
#define BUFFERSIZE 1024 //缓冲区大小
#define RUNNING 1 //运行状态
#endif
/***********************************************************************/
服务器端:
#include "common.h"
int main (int argc, char *argv[])
{
int sockfd = -1, newfd = -1;
struct sockaddr_in server_addr, client_addr; //保存套接字结构信息服务器和客服端信息
socklen_t addrlen = addrsize;
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
int rc, wc;
sockfd = socket(PF_INET, SOCK_STREAM, 0); //建立socket连接
if(sockfd == -1)
Err_sys("Server socket")
bzero(&server_addr, addrsize);
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //0.0.0.0
server_addr.sin_port = htons(port);
int i = 1; //允许重复使用本地地址与套接字进行绑定
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof(i));//Server bind Address already in use
if(bind(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1) //绑定函数bind()
{
close(sockfd);
Err_sys("Server bind")
}
if(listen(sockfd, 10) == -1) //调用listen()函数,监听,队列中允许的最大请求数
{
close(sockfd);
Err_sys("Server listen")
}
bzero(&client_addr, addrsize);
printf("Waiting a new connection/n");
ee: newfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen); //调用accept()函数,等待客服端的连接
if(newfd == -1)
{
if(errno == EINTR)
goto ee;
}
else
printf("Create a new connection ip[%s]::port[%d]/n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
memset(buffer_r, '/0', BUFFERSIZE);
while(RUNNING)
{
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(newfd, buffer_r, BUFFERSIZE, 0); //接收客服端发来的信息
if(rc <= 0)
{
if(rc == 0)
{
printf("Client has been closed/n");
}
close(newfd);
close(sockfd);
exit(EXIT_FAILURE);
}
else
printf("[Server recv]:%s/n", buffer_r);
memset(buffer_w, '/0', BUFFERSIZE);
printf("[Server send]:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin);
wc = send(newfd, buffer_w, strlen(buffer_w), 0); //发送信息到客服端
if(wc < 0)
{
close(sockfd);
close(newfd);
Err_sys("Server send")
}
}//while
close(sockfd);
close(newfd);
exit(EXIT_SUCCESS);
}
/****************************************************************/
客户端:
#include "common.h"
int main(int argc, char **argv)
{
int sockfd = -1;
struct sockaddr_in server_addr; //定义套接字结构体保持socket信息
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE]; //定义读缓冲和写缓冲
socklen_t addrlen = addrsize; //设置结构体大小
int wc, rc;
if(argc != 5)
{
fprintf(stderr, "%s -p port -i ip/n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd = socket(PF_INET, SOCK_STREAM, 0); //建立socket连接
if(sockfd == -1)
Err_sys("Client socket")
bzero(&server_addr, addrsize); //设置sockaddr_in结构体中相关参数
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[4]);
server_addr.sin_port = htons(atoi(argv[2]));
int count = 0; //调用connect()函数主动发起对服务器端的连接
while(connect(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
if(count++ <= 3) //连接成功
{
fprintf(stderr, "Client is trying to connect.../n");
sleep(3);
}
else //连接失败
{
fprintf(stderr, "Client connects failurefully/n");
close(sockfd); //shutdown(sockfd, SHUT_RDWR);
exit(EXIT_FAILURE);
}
}
while(RUNNING) //运行时
{
memset(buffer_w, '/0', BUFFERSIZE);
printf("[Client send]:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin); //获取标准输入的内容 存到缓冲区
wc = send(sockfd, buffer_w, strlen(buffer_w), 0); //发送消息给服务器端
if(wc < 0)
Err_sys("Client send")
//printf("111111111111111111111/n");
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(sockfd, buffer_r, BUFFERSIZE, 0); //收到服务器发来的消息
if(rc <= 0)
{
if(rc == 0)
{
printf("Server has been closed/n");
}
close(sockfd);
exit(EXIT_FAILURE);
}
else
printf("[Client recv]:%s/n", buffer_r);
}//while
close(sockfd);
exit(EXIT_SUCCESS);
}
/***********************************************************************/
服务器端2:
#include "common.h"
int main (int argc, char *argv[])
{
int sockfd = -1, newfd = -1;
struct sockaddr_in server_addr, client_addr;
socklen_t addrlen = addrsize;
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
int rc, wc;
int i = 1;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
Err_sys("Server socket")
bzero(&server_addr, addrsize);
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //0.0.0.0
server_addr.sin_port = htons(port);
if(bind(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
close(sockfd);
Err_sys("Server bind")
}
if(listen(sockfd, 10) == -1)
{
close(sockfd);
Err_sys("Server listen")
}
bzero(&client_addr, addrsize);
printf("Waiting a new connection/n");
ee: newfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen);
if(newfd == -1)
{
if(errno == EINTR)
goto ee;
}
else
printf("Create a new connection ip[%s]::port[%d]/n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(newfd, buffer_r, BUFFERSIZE, 0);
if(rc <= 0)
{
if(rc == 0)
{
printf("Client has been closed/n");
}
close(newfd);
close(sockfd);
exit(EXIT_FAILURE);
}
else
printf("[Server recv]:%s/n", buffer_r);
close(sockfd);
close(newfd);
exit(EXIT_SUCCESS);
}
/************************************************************************/
客户端2:
#include "common.h"
int main(int argc, char **argv)
{
int sockfd = -1;
struct sockaddr_in server_addr;
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
socklen_t addrlen = addrsize;
int wc, rc;
if(argc != 5)
{
fprintf(stderr, "%s -p port -i ip/n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
Err_sys("Client socket")
bzero(&server_addr, addrsize);
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[4]);
server_addr.sin_port = htons(atoi(argv[2]));
int count = 0;
while(connect(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
if(count++ <= 3)
{
fprintf(stderr, "Client is trying to connect.../n");
sleep(3);
}
else
{
fprintf(stderr, "Client connects failurefully/n");
close(sockfd); //shutdown(sockfd, SHUT_RDWR);
exit(EXIT_FAILURE);
}
}
memset(buffer_w, '/0', BUFFERSIZE);
printf("Please input the sending message:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin);
wc = send(sockfd, buffer_w, strlen(buffer_w), 0);
if(wc < 0)
Err_sys("Client send")
exit(EXIT_SUCCESS);
}
/**************************************************************/
TCP多进程并发通信
/***************************************************************/
服务器端:
#include "common.h"
void sig_chld(int signo)
{
psignal(signo, "Catch signal");
int status;
while(wait(&status) == -1);
signal(SIGCHLD, sig_chld);
}
int main (int argc, char *argv[])
{
int sockfd = -1, newfd = -1;
struct sockaddr_in server_addr, client_addr;
socklen_t addrlen = addrsize;
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
int rc, wc;
pid_t pt;
fd_set readfds;
int maxfd;
struct timeval tv;
int ret = -1;
signal(SIGCHLD, sig_chld);
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
Err_sys("Server socket")
bzero(&server_addr, addrsize);
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //0.0.0.0
server_addr.sin_port = htons(port);
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof(i));//Server bind Address already in use
if(bind(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
close(sockfd);
Err_sys("Server bind")
}
if(listen(sockfd, 10) == -1)
{
close(sockfd);
Err_sys("Server listen")
}
while(RUNNING)
{
printf("Waiting a new connection/n");
newfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen);
if(newfd == -1)
{
if(errno == EINTR)
continue;
Err_sys("Server accept")
}
else
printf("Create a new connection ip[%s]::port[%d]/n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
pt = fork(); //创建子进程
if(pt == -1)
{
close(newfd);
close(sockfd);
Err_sys("Fork")
}
else if(pt == 0) //child process
{
close(sockfd);
while(RUNNING)
{
maxfd = newfd;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(0, &readfds);//FD_SET(STDIN_FILENO, &readfds);
FD_SET(newfd, &readfds);
ret = select(maxfd + 1, &readfds, NULL, NULL, &tv);
switch(ret)
{
case -1:
if(errno == EINTR)
continue;
Err_sys("Server select")
case 0:
//printf("Server timeout/n");
continue;
default:
if(FD_ISSET(newfd, &readfds))
{
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(newfd, buffer_r, BUFFERSIZE, 0);
if(rc <= 0)
{
if(rc == 0)
{
FD_CLR(sockfd, &readfds);
printf("Client has been closed/n");
}
close(newfd);
close(sockfd);
exit(EXIT_FAILURE);
}
else
printf("[Server recv]:%s/n", buffer_r);
}//recv
if(FD_ISSET(0, &readfds))
{
memset(buffer_w, '/0', BUFFERSIZE);
printf("[Server send]:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin);
wc = send(newfd, buffer_w, strlen(buffer_w), 0);
if(wc < 0)
{
close(sockfd);
close(newfd);
Err_sys("Server send")
}
}//send
}//switch
}//while read/write
} //else if(pt == 0)
else
close(newfd);
}//while accept
close(sockfd);
close(newfd);
exit(EXIT_SUCCESS);
}
/***********************************************************************/
客户端:
#include "common.h"
int main(int argc, char **argv)
{
int sockfd = -1;
struct sockaddr_in server_addr;
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
socklen_t addrlen = addrsize;
int wc, rc;
int maxfd;
fd_set readfds;
int ret = -1;
struct timeval tv;
if(argc != 5)
{
fprintf(stderr, "%s -p port -i ip/n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
Err_sys("Client socket")
bzero(&server_addr, addrsize);
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[4]);
server_addr.sin_port = htons(atoi(argv[2]));
int count = 0;
while(connect(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
if(count++ <= 3)
{
fprintf(stderr, "Client is trying to connect.../n");
sleep(3);
}
else
{
fprintf(stderr, "Client connects failurefully/n");
close(sockfd); //shutdown(sockfd, SHUT_RDWR);
exit(EXIT_FAILURE);
}
}
while(RUNNING)
{
tv.tv_sec = 1;
tv.tv_usec = 0;
maxfd = sockfd;
FD_ZERO(&readfds);
FD_SET(0, &readfds);
FD_SET(sockfd, &readfds);
if((ret = select(maxfd + 1, &readfds, NULL, NULL, &tv)) == -1)
{
if(errno == EINTR)
continue;
close(sockfd);
Err_sys("Client select")
}
else if(ret == 0)
{
//printf("Client timeout");
continue;
}
else if(ret > 0)
{
if(FD_ISSET(0, &readfds))
{
memset(buffer_w, '/0', BUFFERSIZE);
printf("[Client send]:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin);
wc = send(sockfd, buffer_w, strlen(buffer_w), 0);
if(wc < 0)
Err_sys("Client send")
}//send
if(FD_ISSET(sockfd, &readfds))
{
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(sockfd, buffer_r, BUFFERSIZE, 0);
if(rc <= 0)
{
if(rc == 0)
{
FD_CLR(sockfd, &readfds);
printf("Server has been closed/n");
}
close(sockfd);
exit(EXIT_FAILURE);
}
else
printf("[Client recv]:%s/n", buffer_r);
}//recv
}
}//while
close(sockfd);
exit(EXIT_SUCCESS);
}
/***************************************************************/
TCP多线程并发网络编程
/***************************************************************/
服务器端:
#include "common.h"
/*Thread function for reading and writing*/
void *rdwrthread(void *arg)
{
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
int rc, wc;
int outfd = *(int *)arg;
fd_set readfds;
int maxfd;
struct timeval tv;
int ret = -1;
while(RUNNING)
{
maxfd = outfd;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(0, &readfds);//FD_SET(STDIN_FILENO, &readfds);
FD_SET(outfd, &readfds);
ret = select(maxfd + 1, &readfds, NULL, NULL, &tv);
switch(ret)
{
case -1:
if(errno == EINTR)
continue;
Err_sys("Server select")
case 0:
//printf("Server timeout/n");
continue;
default:
if(FD_ISSET(outfd, &readfds))
{
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(outfd, buffer_r, BUFFERSIZE, 0);
if(rc <= 0)
{
if(rc == 0)
{
FD_CLR(outfd, &readfds);
printf("Client has been closed/n");
}
close(outfd);
pthread_exit(NULL);
}
else
printf("[Server recv]:%s/n", buffer_r);
}//recv
if(FD_ISSET(0, &readfds))
{
memset(buffer_w, '/0', BUFFERSIZE);
printf("[Server send]:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin);
wc = send(outfd, buffer_w, strlen(buffer_w), 0);
if(wc < 0)
{
close(outfd);
Err_sys("Server send")
}
}//send
}//switch
}//while read/write
return NULL;
}
int main (int argc, char *argv[])
{
int sockfd = -1, newfd = -1;
struct sockaddr_in server_addr, client_addr;
socklen_t addrlen = addrsize;
pthread_t pd;
pthread_attr_t attr;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
Err_sys("Server socket")
bzero(&server_addr, addrsize);
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //0.0.0.0
server_addr.sin_port = htons(port);
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof(i));//Server bind Address already in use
if(bind(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
close(sockfd);
Err_sys("Server bind")
}
if(listen(sockfd, 10) == -1)
{
close(sockfd);
Err_sys("Server listen")
}
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
while(RUNNING)
{
printf("Waiting a new connection/n");
newfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen);
if(newfd == -1)
{
if(errno == EINTR)
continue;
pthread_attr_destroy(&attr);
Err_sys("Server accept")
}
else
printf("Create a new connection ip[%s]::port[%d]/n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
if(pthread_create(&pd, &attr, rdwrthread, (void *)&newfd) != 0)
{
close(newfd);
close(sockfd);
pthread_attr_destroy(&attr);
Err_sys("Server pthread_create")
}
else
fprintf(stdout, "Current master thread[%u] creates a new slave thread[%u]/n", pthread_self(), pd);
}//while accept
close(sockfd);
close(newfd);
pthread_attr_destroy(&attr);
exit(EXIT_SUCCESS);
}
/****************************************************************/
客户端:
#include "common.h"
int main(int argc, char **argv)
{
int sockfd = -1;
struct sockaddr_in server_addr; //定义套接字结构体保持socket信息
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE]; //定义读缓冲和写缓冲
socklen_t addrlen = addrsize; //设置结构体大小
int wc, rc;
int maxfd;
fd_set readfds; //读文件描述符集
int ret = -1;
struct timeval tv; //时间结构体
if(argc != 5)
{
fprintf(stderr, "%s -p port -i ip/n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd = socket(PF_INET, SOCK_STREAM, 0); //建立socket连接
if(sockfd == -1)
Err_sys("Client socket")
bzero(&server_addr, addrsize); //设置sockaddr_in结构体中相关参数
server_addr.sin_family = PF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[4]);
server_addr.sin_port = htons(atoi(argv[2]));
int count = 0; //调用connect()函数主动发起对服务器端的连接
while(connect(sockfd, (struct sockaddr *)&server_addr, addrsize) == -1)
{
if(count++ <= 3) //连接成功
{
fprintf(stderr, "Client is trying to connect.../n");
sleep(3);
}
else //连接失败
{
fprintf(stderr, "Client connects failurefully/n");
close(sockfd); //shutdown(sockfd, SHUT_RDWR);
exit(EXIT_FAILURE);
}
}
while(RUNNING)
{
tv.tv_sec = 1; //设置多路复用超时时间1s
tv.tv_usec = 0;
maxfd = sockfd;
FD_ZERO(&readfds); //清除一个文件描述符集
FD_SET(0, &readfds); //将标准输入加入到读文件描述符集
FD_SET(sockfd, &readfds); //将套接字文件描述符加入到读文件描述符集
if((ret = select(maxfd + 1, &readfds, NULL, NULL, &tv)) == -1) //判断文件描述符在1s内是否变化
{
if(errno == EINTR) //遇到中断的处理
continue;
close(sockfd);
Err_sys("Client select")
}
else if(ret == 0) //超时处理
{
//printf("Client timeout");
continue;
}
else if(ret > 0) //文件描述符集内有变化
{
if(FD_ISSET(0, &readfds)) //标准输入文件描述符发生了变化
{
memset(buffer_w, '/0', BUFFERSIZE);
printf("[Client send]:");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin); //获取标准输入的内容 存到缓冲区
wc = send(sockfd, buffer_w, strlen(buffer_w), 0); //发送消息给服务器端
if(wc < 0)
Err_sys("Client send")
}//send
if(FD_ISSET(sockfd, &readfds)) //sockfd文件描述符发生了变化
{
memset(buffer_r, '/0', BUFFERSIZE);
rc = recv(sockfd, buffer_r, BUFFERSIZE, 0); //收到服务器发来的消息
if(rc <= 0)
{
if(rc == 0)
{
FD_CLR(sockfd, &readfds); //将sockfd从文件描述符集中删除
printf("Server has been closed/n");
}
close(sockfd); //关闭
exit(EXIT_FAILURE);
}
else
printf("[Client recv]:%s/n", buffer_r); //打印出内容
}//recv
}
}//while
close(sockfd); //关闭套接字
exit(EXIT_SUCCESS); //成功返回
}
- 网络编程—TCP
- QT网络编程—TCP
- Linux 网络编程——TCP编程
- PYthon -网络编程—TCP编程
- 网络编程————TCP
- Linux 网络编程——TCP
- linux网络编程——TCP文件服务器
- Linux 网络编程——TCP
- Java网络编程——TCP介绍
- 黑马程序员——网络编程TCP
- 网络编程——TCP连接
- linux网络编程——初探TCP
- Linux 网络编程——TCP(转)
- python网络编程——TCP
- Linux网络编程——TCP通信
- JAVA——网络编程(TCP)
- TCP/IP——网络编程模型
- Linux网络编程——tcp实例
- kmalloc/kfree,vmalloc/vfree函数用法和区别
- hdu 2005 java_calendar
- NAT服务器的搭建
- 摘抄
- UML基础: 统一建模语言简介
- 网络编程—TCP
- 警告:您的时钟错误,你的创建可能是不完整的
- vs2008快捷键大全
- 做好这基本的几点,我们会离成熟、成功更近.
- c/c++内存管理---堆和栈的区别(转)二
- 快速判断文件是文本文件或二进制文件
- OnDraw(CDC *pDC)
- Linux驱动---时间、延迟及延缓操作(转)
- [问题] [悬赏完成]解密文件 [复制链接]