使用时可以将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
/************************************************************************* > 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"); }
#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); }
#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);
#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); }