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