Lunix网络编程之socket(客户端发送请求,服务器处理例如:排序,两人联机五子棋)

使用时可以将my_socket.h 和my_socket.c封装成库

封装库的方法在linux学习 建立静态库,动态库,写简单的makefile http://blog.csdn.net/youngyangyang04/article/details/38616463

或者编译的时候直接gcc  .c -o .exe -I ./  就是编译的时候直接把my_socket.h 和my_socket.c加进去

my_socket.h

/*************************************************************************
	> File Name: my_socket.h
	> Author: yang
	> Mail:[email protected] 
	> Created Time: 2014年09月01日 星期一 16:28:04
 ************************************************************************/

#ifndef __MY_SOCKET_H__
#define __MY_SOCKET_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IN
#define OUT
#define IN_OUT
#define MY_TCP 1
#define MY_UDP 2
typedef struct sockaddr* pSA;
typedef struct sockaddr_in SA;
#define ASSERT(flag,msg) ((flag)? NULL:(fprintf(stdout,msg),exit(EXIT_FAILURE)))//如果flag为假,则执行后面
//tcp/udp表示在tcp udp都可以用
void my_socketCli(int *fd_socket,int type,char* ip,int port,SA *my_addr);//tcp/udp客户端不需要绑定,但得把存有server的addr发过去,所以的将addr传出
void my_connect(int fd_socket,pSA server_addr,int len);//tcp客户端链接服务器
void my_socketSer(int *fd_socket,int type,char *ip,int port);//tcp/udp服务器端需要绑定自己的addr
void my_listen(int fd_socket,int listen_num);//tcp中服务器端一定别忘了listen
void my_accept(int *fd_client,int fd_socket,pSA client_addr,int *addrlen);//tcp服务器端接受客户端发来的信号,并将信息保存到client_addr结构体中,以后就用fd_client来链接服务器
void my_send(int* sendlen,int fd_socket,int *msg , int len);//tcp,这里msg是一个int型的数组
void my_recv(int* recvlen,int fd_socket,int *msg, int len);//tcp
void my_sendto(int* send_num,int fd_socket,int *msg,int len,pSA server_addr,int addrlen);//udp中使用
void my_recvfrom(int* recv_num,int fd_socket,int* msg,int len,pSA client_addr,int *addrlen);//udp中使用
void my_close(int fd_socket);//tcp/udp 关掉描述符

#endif

my_socket.c

/*************************************************************************
	> File Name: my_socket.c
	> Author: yang
	> Mail:[email protected] 
	> Created Time: 2014年09月01日 星期一 17:30:26
 ************************************************************************/

#include<my_socket.h>
void my_socketCli(int *fd_socket,int type,char* ip,int port,SA *my_addr){
	ASSERT(type==MY_TCP||type==MY_UDP,"invalid arg\n");
	if(type==MY_TCP){
		ASSERT((*fd_socket=socket(AF_INET,SOCK_STREAM,0))!=-1,"TCP socket init fail\n");
	}else if(type==MY_UDP){
		ASSERT((*fd_socket=socket(AF_INET,SOCK_DGRAM,0))!=-1,"UDP socket init fail\n");
	}
		memset(my_addr,0,sizeof(SA));
		(*my_addr).sin_family=AF_INET;
		(*my_addr).sin_port=htons(port);
		(*my_addr).sin_addr.s_addr=inet_addr(ip);
}
void my_socketSer(int *fd_socket,int type,char* ip,int port){
	ASSERT(type==MY_TCP || type==MY_UDP,"invalid arg\n");
	if(type==MY_TCP){
		ASSERT((*fd_socket=socket(AF_INET,SOCK_STREAM,0))!=-1,"TCP socket init fail\n");
	}else if(type==MY_UDP){
		ASSERT((*fd_socket=socket(AF_INET,SOCK_DGRAM,0))!=-1,"UDP socket init fail\n");
	}
		SA my_addr;
		memset(&my_addr,0,sizeof(my_addr));
		my_addr.sin_family=AF_INET;
		printf("%d  %s\n",port,ip);
		my_addr.sin_port=htons(port);
		my_addr.sin_addr.s_addr=inet_addr(ip);
		int len=sizeof(my_addr);
		ASSERT(bind(*fd_socket,(struct sockaddr*)&my_addr,len)!=-1,"bind fail\n");
		return ;
}
void my_accept(int *fd_client,int fd_socket,pSA client_addr,int* addrlen){
	ASSERT((*fd_client = accept(fd_socket,client_addr,addrlen))!=-1,"server accept fail\n");
}
void my_send(int *sendlen,int fd_socket,int *msg,int len){
	ASSERT((*sendlen=send(fd_socket,msg,len,0))!=-1,"send fail\n");
}
void my_recv(int *recvlen,int fd_socket,int *msg,int len){
	ASSERT((*recvlen=recv(fd_socket,msg,len,0))!=-1,"recv fail\n");
}
void my_connect(int fd_socket,pSA server_addr,int len){
	int cnt=0;
	while(connect(fd_socket,server_addr,len)!=0){
		cnt++;
		if(cnt==10){
			fprintf(stdout,"connect fail\n");
			exit(EXIT_FAILURE);
		}
	}
}
void my_sendto(int* send_num,int fd_socket,int *msg,int len,pSA server_addr,int addrlen){
	ASSERT((*send_num=sendto(fd_socket,msg,len,0,server_addr,addrlen))!=-1,"sendto fail\n");

}
void my_recvfrom(int* recv_num,int fd_socket,int *msg,int len,pSA client_addr,int* addrlen){

	ASSERT((*recv_num=recvfrom(fd_socket,msg,len,0,client_addr,addrlen))!=-1,"recvfrom fail\n");

}
void my_close(int fd_socket){
	ASSERT((close(fd_socket)!=-1),"close fail\n");
}

void my_listen(int fd_socket,int listen_num){
	ASSERT((listen(fd_socket,listen_num))!=-1,"listen fail\n");
}



排序:客户端给出请求,服务器排序,再将结果发回去

gcc server.c  my_sort.c  my_socket.c  -o server -I ./  进行编译server,所有文件在一个文件夹下
gcc  client.c  my_sort.c  my_socket.c -o client -I ./
server.c
#include<my_socket.h>
#include<my_sort.h>
#define IP "127.0.1.1"
#define PORT 8888
int main(){
	SA client_addr;
	int fd_socket,fd_client;
	my_socketSer(&fd_socket,MY_TCP,IP,PORT);//初始化socket
	my_listen(fd_socket,5);//监听
	int sendlen,recvlen,msg[128];
	int len;
	my_accept(&fd_client,fd_socket,(pSA)&client_addr,&len);//接受客户端,接到客户端的addr
	my_recv(&recvlen,fd_client,msg,1024);//接受客户端信息
	arr_show(msg,10);
	printf("recvlen:%d\n",recvlen);
//	insert_sort(msg,recvlen/4);或者可以用这个函数排序
	quick_sort(msg,0,recvlen/4-1);//排序
	my_send(&sendlen,fd_client,msg,recvlen);//发回客户端
	my_close(fd_socket);
	my_close(fd_client);
}
	

client.c

#include<my_socket.h>
#include<my_sort.h>
#define IP "127.0.1.1"
#define PORT 8888
int main(){
	srand(getpid());
	SA server_addr;
	int fd_socket,index,msg[128],sendlen,recvlen;
	my_socketCli(&fd_socket,MY_TCP,IP,PORT,&server_addr);//客户端socket初始化
	my_connect(fd_socket,(pSA)&server_addr,sizeof(SA));//链接服务器
	arr_init(msg,10);//准备要发送的信息
	arr_show(msg,10);
	my_send(&sendlen,fd_socket,msg,10*4);//发送给服务器端
	my_recv(&recvlen,fd_socket,msg,1024);//接受来自服务器的数据
	printf("after sort\n");
	arr_show(msg,10);//显示处理的信息
	my_close(fd_socket);
}
	


my_sort.h

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void arr_init(int *arr,int len);
void arr_show(int *arr,int len);
void insert_sort(int *arr,int len);
void quick_sort(int *arr,int left,int right);

my_sort.c

#include<my_sort.h>
void arr_init(int* arr,int len){
	int index;
	for(index=0;index<len;index++)
		arr[index]=rand()%1000;
}
void arr_show(int* arr,int len){
	int index;
	for(index=0;index<len;index++)
		printf("%d ",arr[index]);
	printf("\n");
}
void insert_sort(int*arr,int len){
	int pos,index;
	int key;
	for(pos=1;pos<len;pos++){
		key=arr[pos];
		for(index=pos-1;index>=0;index--){
			if(arr[index]<key)
				break;
			else
				arr[index+1]=arr[index];
		}
		arr[index+1]=key;
	}
}
void quick_sort(int *a,int left,int right){
	int l=left,r=right;
	int key=a[left];
	while(l<r){
		while(l<r && a[r]>=key) r--;
		if(l<r)
			a[l++]=a[r];
		while(l<r && a[l]<=key) l++;
		if(l<r)
			a[r--]=a[l];
	}
	a[l]=key;
	if(left>=right) return ;
	int mid=l;
	quick_sort(a,left,mid);
	quick_sort(a,mid+1,right);
}




































发布了214 篇原创文章 · 获赞 78 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/youngyangyang04/article/details/39017025