一,建立套接字html
int socket(int domain,int type,int protocol)服務器
socket 返回一個套接字描述符dom
StreamSocket = socket(AF_INET,SOCK_STREAM,0) TCP類型socket
DgramSocket = socket(AF_INET,SOCK_DGRAM,0) UDP類型ui
RawSocket = sokcet(AF_INET,SOCK_RAW,IPPROTO_RAW)spa
AF_INET表示要使用IPv4 Internet協議,第二個參數是協議的通訊類型,TCP,UDP等code
二,套接字地址orm
struct sockaddr_in{server
int16_t sin_family;htm
uint16_t sin_port; 端口號
struct in_addr sin_addr; IPv4的地址
char sin_zero[8];
}
struct in_addr{
uint32_t s_addr;
}
爲了進行通訊 用AF_INET惟一肯定 sin_family.
三,套接字原語
int bind(int sock,struct sockaddr *addr,int addrLen)
用於綁定套接字和地址
sock 套接字描述符
地址結構體已經肯定,因此必須使用(sockaddr*)將sockaddr_in 轉化爲sockaddr類型
int listen(int sock,int backlog)
backlog 指明等待鏈接的客戶端隊列中能夠有幾個客戶端
int accept(int sock,struct sockaddr *addr,int *addrLen)
addr 是想知道誰向本身發送鏈接請求
struct sockaddr_in addr;
int len;
len = sizeof(struct sockaddr_in);
sock = accept(serversock,(struct sockaddr*)addr,&len)
若是對誰的請求不關心
accept(serversock,(struct sockaddr*,NULL,NULL)
int connect(int sock,(struct sockaddr*)servaddr,int addLen)
四,套接字輸入輸出
TCP 面向鏈接的
int send(int sock,const void*msg,int len,unsigned int flags)
返回<0表明錯誤類型,>0表明傳遞的字節數。
msg 消息,len 消息長度,flag 基本爲0 能夠設定send的行爲如MSG_DONTWAIT 當可用空間不足時send 就返回
int recv(int sock,void*buf,int len,unsigned int flags);
UDP
int sendto(int sock,const void*msg,int len,unsigned int flags,const struct sockaddr *to,int tolen)
int recvform(int sock,void*buf,int len,unisgned int flags,sturct sockaddr *from,int *fromlen)
五,套接字選項
int getsockopt(int sock,int level,int optname,void *optval,socklen_t *optlen);
int setsockopt(int sock,int level,int optname,const void *optval,socklen_t optlen)
struct hostnet *gethostbyname(const char*name)
eg:
struct hostnet*hptr;
hptr = gethostbyname("www.baidu.com")其實就是域名解析
int getsockname(int sock,struct sockaddr *name,socklen_t*namelen)
int getpeername(int sock,struct sockaddr*name,socklen_t *namelen)
請求時間獲取服務器
/************************************************************************* > File Name: server_of_date.c > Author: nealgavin > Mail: nealgavin@126.com > Created Time: Tue 03 Jun 2014 08:02:38 PM CST ************************************************************************/ #include<stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <time.h> #include <string.h> #include <unistd.h> #define MAX_BUFFER 128 #define DAYTIME_SERVER_PORT 1413 int main() { int serverSK,connectSK; struct sockaddr_in servaddr; char timebuffer[ MAX_BUFFER ]; time_t currentTime; serverSK = socket(AF_INET,SOCK_STREAM,0); /* AF_INET confirm use IPv4 Protocol * SOCK_STREAM confirm Stream type * 0 confirm TCP */ memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /*receive any type of socket*/ servaddr.sin_port = htons(DAYTIME_SERVER_PORT); bind( serverSK,(struct sockaddr *)&servaddr,sizeof(servaddr) ); /*bing the socket and address*/ listen(serverSK,5); puts("start tel"); while(1) { connectSK = accept( serverSK,(struct sockaddr*)NULL,NULL ); if (connectSK >= 0) { printf("client connet to server.Socket:%d\n",connectSK); currentTime = time(NULL); snprintf(timebuffer, MAX_BUFFER,"%s\n",ctime(¤tTime)); write( connectSK,timebuffer,strlen(timebuffer) ); close( connectSK ); } } return 0; }
/************************************************************************* > File Name: client_of_date.c > Author: nealgavin > Mail: nealgavin@126.com > Created Time: Tue 03 Jun 2014 08:36:18 PM CST ************************************************************************/ #include<stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> #include <time.h> #define MAX_BUFFER 128 #define DAYTIME_SERVER_PORT 1413 int main() { int connectSK,in,index=0,limit=MAX_BUFFER,ret; struct sockaddr_in servaddr; char timeBuffer[ MAX_BUFFER+1 ]; connectSK = socket(AF_INET,SOCK_STREAM,0); memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(DAYTIME_SERVER_PORT); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret = connect(connectSK,(struct sockaddr*)&servaddr,sizeof(servaddr)); printf("client connect to server.ans=%d\n",ret); if(ret == -1) { puts("connect false"); return 0; } while((in = read(connectSK,&timeBuffer[index],limit))>0) { index += in; limit -= in; } timeBuffer[index] = '\0'; printf("\ndate:%s\n",timeBuffer); close(connectSK); return 0; }