Client端:
int main(int argc,char *argv[]) /*main 函数*/
{
pthread_t SELECT;
if(pthread_create(&SELECT, NULL, process_info1, NULL) != 0) /*起一个线程*/
{
printf(" SELECT thread failed\n");
exit(1);
}
while(1)
{
}
}
void * process_info1(void *arg) /*线程处理的函数*/
{
struct sockaddr_in addr_serv; //服务器端地址
struct sockaddr_in ss;
memset(&ss, 0, sizeof(struct sockaddr_in));
socklen_t len = sizeof(struct sockaddr_in)
char *p;
sock_fd = socket(AF_INET,SOCK_STREAM,0); /*TCP SOCKET*/
if(sock_fd < 0)
{
perror("sock");
exit(1);
}
else
{
printf("sock sucessful:\n");
}
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(DEST_PORT);
addr_serv.sin_addr.s_addr = inet_addr(DEST_IP_ADDRESS);
if( connect(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr)) < 0) /*连接*/
{
perror("connect");
printf("connect (%d)\n",errno);
exit(1);
} else {
printf("connect sucessful\n");
}
if(getsockname(sock_fd, (struct sockaddr *)&ss, &len)<0)
{
exit(1);
}
p=inet_ntoa(*(struct in_addr *)&ss.sin_addr.s_addr);
printf("Ip is:%s\n",p);
int recv_num;
char recv_buf[50];
fd_set fds;
struct timeval timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0
char buffer[256]={0}; //256字节的接收缓冲区
while(1) /*循环收包*/
{
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sock_fd,&fds); //添加描述符
switch(select(sock_fd+1,&fds,NULL,NULL,&timeout)) //select使用
{
case -1:
exit(1);
break; //select错误,退出程序
case 0:
break; //再次轮询
default:
if(FD_ISSET(sock_fd,&fds)) //测试sock是否可读,即是否网络上有数据
{
recv_num = recv(sock_fd,recv_buf,sizeof(recv_buf),0);
if(recv_num < 0)
{
perror("recv");
printf("recv_num < 0\n");
exit(1);
}
else
{
recv_buf[recv_num]='\0';
printf("recv sucess:%s\n",recv_buf);
}
}// end if break;
}// end switch
}//end while
}
server端:
void process_info(int s)
{
int recv_num;
int send_num;
char recv_buf[50];
char send_buf[50] ="hello world";
int i=0;
while(i<10){
printf("begin send\n");
send_num = send(s,send_buf,sizeof(send_buf),0);
if (send_num < 0){
perror("sned");
exit(1);
} else {
printf("send sucess\n");
}
i++;
}
exit(0);
}
int main()
{
int sock_fd,conn_fd;
int client_len;
pid_t pid;
struct sockaddr_in addr_serv,addr_client;
sock_fd = socket(AF_INET,SOCK_STREAM,0);
if(sock_fd < 0){
perror("socket");
exit(1);
} else {
printf("sock sucessful\n");
}
//初始化服务器端地址
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(SOURCE_PORT);
addr_serv.sin_addr.s_addr =inet_addr(SOURCE_IP_ADDRESS);
client_len = sizeof(struct sockaddr_in);
if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0){
perror("bind");
exit(1);
} else {
printf("bind sucess\n");
}
if (listen(sock_fd,QUEUE_LINE) < 0){
perror("listen");
exit(1);
} else {
printf("listen sucessful\n");
}
while(1){
printf("begin accept:\n");
conn_fd = accept(sock_fd,(struct sockaddr *)&addr_client,&client_len);
if(conn_fd < 0){
perror("accept");
exit(1);
}
printf("accept a new client,ip:%s\n",inet_ntoa(addr_client.sin_addr));
pid = fork();
if(0 == pid){ //子进程
close(sock_fd);//在子进程中关闭服务器的侦听
process_info(conn_fd);//处理信息
} else {
close(conn_fd);//在父进程中关闭客户端的连接
}
}
}
int main(int argc,char *argv[]) /*main 函数*/
{
pthread_t SELECT;
if(pthread_create(&SELECT, NULL, process_info1, NULL) != 0) /*起一个线程*/
{
printf(" SELECT thread failed\n");
exit(1);
}
while(1)
{
}
}
void * process_info1(void *arg) /*线程处理的函数*/
{
struct sockaddr_in addr_serv; //服务器端地址
struct sockaddr_in ss;
memset(&ss, 0, sizeof(struct sockaddr_in));
socklen_t len = sizeof(struct sockaddr_in)
char *p;
sock_fd = socket(AF_INET,SOCK_STREAM,0); /*TCP SOCKET*/
if(sock_fd < 0)
{
perror("sock");
exit(1);
}
else
{
printf("sock sucessful:\n");
}
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(DEST_PORT);
addr_serv.sin_addr.s_addr = inet_addr(DEST_IP_ADDRESS);
if( connect(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr)) < 0) /*连接*/
{
perror("connect");
printf("connect (%d)\n",errno);
exit(1);
} else {
printf("connect sucessful\n");
}
if(getsockname(sock_fd, (struct sockaddr *)&ss, &len)<0)
{
exit(1);
}
p=inet_ntoa(*(struct in_addr *)&ss.sin_addr.s_addr);
printf("Ip is:%s\n",p);
int recv_num;
char recv_buf[50];
fd_set fds;
struct timeval timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0
char buffer[256]={0}; //256字节的接收缓冲区
while(1) /*循环收包*/
{
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sock_fd,&fds); //添加描述符
switch(select(sock_fd+1,&fds,NULL,NULL,&timeout)) //select使用
{
case -1:
exit(1);
break; //select错误,退出程序
case 0:
break; //再次轮询
default:
if(FD_ISSET(sock_fd,&fds)) //测试sock是否可读,即是否网络上有数据
{
recv_num = recv(sock_fd,recv_buf,sizeof(recv_buf),0);
if(recv_num < 0)
{
perror("recv");
printf("recv_num < 0\n");
exit(1);
}
else
{
recv_buf[recv_num]='\0';
printf("recv sucess:%s\n",recv_buf);
}
}// end if break;
}// end switch
}//end while
}
server端:
void process_info(int s)
{
int recv_num;
int send_num;
char recv_buf[50];
char send_buf[50] ="hello world";
int i=0;
while(i<10){
printf("begin send\n");
send_num = send(s,send_buf,sizeof(send_buf),0);
if (send_num < 0){
perror("sned");
exit(1);
} else {
printf("send sucess\n");
}
i++;
}
exit(0);
}
int main()
{
int sock_fd,conn_fd;
int client_len;
pid_t pid;
struct sockaddr_in addr_serv,addr_client;
sock_fd = socket(AF_INET,SOCK_STREAM,0);
if(sock_fd < 0){
perror("socket");
exit(1);
} else {
printf("sock sucessful\n");
}
//初始化服务器端地址
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(SOURCE_PORT);
addr_serv.sin_addr.s_addr =inet_addr(SOURCE_IP_ADDRESS);
client_len = sizeof(struct sockaddr_in);
if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0){
perror("bind");
exit(1);
} else {
printf("bind sucess\n");
}
if (listen(sock_fd,QUEUE_LINE) < 0){
perror("listen");
exit(1);
} else {
printf("listen sucessful\n");
}
while(1){
printf("begin accept:\n");
conn_fd = accept(sock_fd,(struct sockaddr *)&addr_client,&client_len);
if(conn_fd < 0){
perror("accept");
exit(1);
}
printf("accept a new client,ip:%s\n",inet_ntoa(addr_client.sin_addr));
pid = fork();
if(0 == pid){ //子进程
close(sock_fd);//在子进程中关闭服务器的侦听
process_info(conn_fd);//处理信息
} else {
close(conn_fd);//在父进程中关闭客户端的连接
}
}
}