c语言实现 windows socket_C语言实现Socket简单通信
點擊上方“學士科技”,選擇“設為星標”
資訊、技術干貨第一時間送達!
C語言基礎合集,點我點我~~~
C語言進階合集,點我點我~~~
C語言高級:
01.C語言實現字符串的加密和解密
02.C語言數據結構——鏈表
03.C語言——文件的基本操作
04.C語言——【數據結構】圖的存儲結構之鄰接表
服務端
/************************************************************************************************************************1、int socket(int family,int type,int protocol)family: ? 指定使用的協議簇:AF_INET(IPv4) AF_INET6(IPv6) AF_LOCAL(UNIX協議) AF_ROUTE(路由套接字) AF_KEY(秘鑰套接字)type: ? 指定使用的套接字的類型:SOCK_STREAM(字節流套接字) SOCK_DGRAMprotocol: ? 如果套接字類型不是原始套接字,那么這個參數就為02、int bind(int sockfd, struct sockaddr *myaddr, int addrlen)sockfd: ? socket函數返回的套接字描述符myaddr: ? 是指向本地IP地址的結構體指針myaddrlen: ? 結構長度struct sockaddr{ ? unsigned short sa_family; //通信協議類型族AF_xx ? char sa_data[14]; //14字節協議地址,包含該socket的IP地址和端口號};struct sockaddr_in{ ? short int sin_family; //通信協議類型族 ? unsigned short int sin_port; //端口號 ? struct in_addr sin_addr; //IP地址 ? unsigned char si_zero[8]; //填充0以保持與sockaddr結構的長度相同};3、int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen)sockfd: ? socket函數返回套接字描述符serv_addr: ? 服務器IP地址結構指針addrlen: ? 結構體指針的長度4、int listen(int sockfd, int backlog)sockfd: ? socket函數綁定bind后套接字描述符backlog: ? 設置可連接客戶端的最大連接個數,當有多個客戶端向服務器請求時,收到此值的影響。默認值205、int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)sockfd: ? socket函數經過listen后套接字描述符cliaddr: ? 客戶端套接字接口地址結構addrlen: ? 客戶端地址結構長度6、int send(int sockfd, const void *msg,int len,int flags)7、int recv(int sockfd, void *buf,int len,unsigned int flags)sockfd: ? socket函數的套接字描述符msg: ? 發送數據的指針buf: ? 存放接收數據的緩沖區len: ? 數據的長度,把flags設置為0*************************************************************************************************************************/讀函數read
ssize_t read(int fd,void *buf,size_t nbyte)
read函數是負責從fd中讀取內容.成功時,read返回實際所讀的字節數,如果返回的值是0,表示已經讀到文件的結束了.
小于0表示出現了錯誤.如果錯誤為EINTR說明讀是由中斷引起的, 如果是ECONNREST表示網絡連接出了問題.參數nbyte是請求讀取的字節數,讀上來的數據保存在緩沖區buf中,同時文件的當前讀寫位置向后移。注意這個讀寫位置和使用C標準I/O庫時的讀寫位置有可能不同,這個讀寫位置是記在內核中的
寫函數write
ssize_t write(int fd,const void *buf,size_t nbytes)
write函數將buf中的nbytes字節內容寫入文件描述符fd.成功時返回寫的字節數.失敗時返回-1. 并設置errno變量. 在網絡程序中,當我們向套接字文件描述符寫時有倆種可能. 1)write的返回值大于0,表示寫了部分或者是全部的數據. 2)返回的值小于0,此時出現了錯誤.我們要根據錯誤類型來處理. 如果錯誤為EINTR表示在寫的時候出現了中斷錯誤. 如果為EPIPE表示網絡連接出現了問題(對方已經關閉了連接).
#include#include#include#include#include#include#include#include#define PORT 1500//端口號#define BACKLOG 5/*最大監聽數*/ int main(){ ? ?int sockfd,new_fd;/*socket句柄和建立連接后的句柄*/ ? ?struct sockaddr_in my_addr;/*本方地址信息結構體,下面有具體的屬性賦值*/ ? ?struct sockaddr_in their_addr;/*對方地址信息*/ ? ?int sin_size; ? ?sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket ? ?if(sockfd==-1){ ? ? ? ?printf("socket failed:%d",errno); ? ? ? ?return -1; ? } ? ?my_addr.sin_family=AF_INET;/*該屬性表示接收本機或其他機器傳輸*/ ? ?my_addr.sin_port=htons(PORT);/*端口號*/ ? ?my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*IP,括號內容表示本機IP*/ ? ?bzero(&(my_addr.sin_zero),8);/*將其他屬性置0*/ ? ?if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){//綁定地址結構體和socket ? ? ? ?printf("bind error"); ? ? ? ?return -1; ? } ? ? ? ?listen(sockfd,BACKLOG);//開啟監聽 ,第二個參數是最大監聽數 ? ? ? ?while(1){ ? ? ? ? ? ?sin_size=sizeof(struct sockaddr_in); ? ? ? ? ? ?new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);//在這里阻塞知道接收到消息,參數分別是socket句柄,接收到的地址信息以及大小 ? ? ? ? ? ?if(new_fd==-1){ ? ? ? ? ? ? ? ?printf("receive failed"); ? ? ? } else{ ? ? ? ? ? ?printf("receive success"); ? ? ? ? ? ?send(new_fd,"Hello World!",12,0);//發送內容,參數分別是連接句柄,內容,大小,其他信息(設為0即可) ? ? ? } ? } ? ?return 0;}客戶端
#include#include#include#include#include#include#include#include #define DEST_PORT 1500//目標地址端口號#define DEST_IP "127.0.0.1"/*目標地址IP,這里設為本機*/ #define MAX_DATA 100//接收到的數據最大程度int main(){ ? ?int sockfd,new_fd;/*cocket句柄和接受到連接后的句柄 */ ? ?struct sockaddr_in dest_addr;/*目標地址信息*/ ? ?char buf[MAX_DATA];//儲存接收數據 ? ?sockfd=socket(AF_INET,SOCK_STREAM,0);/*建立socket*/ ? ?if(sockfd==-1){ ? ? ? ?printf("socket failed:%d",errno); ? } ? ?//參數意義見上面服務器端 ? ?dest_addr.sin_family=AF_INET; ? ? dest_addr.sin_port=htons(DEST_PORT); ? ?dest_addr.sin_addr.s_addr=inet_addr(DEST_IP); ? ?bzero(&(dest_addr.sin_zero),8); ? ? ? ?if(connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr))==-1){//連接方法,傳入句柄,目標地址和大小 ? ? ? ?printf("connect failed:%d",errno);//失敗時可以打印errno ? } else{ ? ? ? ?printf("connect success"); ? ? ? ?recv(sockfd,buf,MAX_DATA,0);//將接收數據打入buf,參數分別是句柄,儲存處,最大長度,其他信息(設為0即可)。 ? ? ? ?printf("Received:%s",buf); ? } ? ?close(sockfd);//關閉socket ? ?return 0;}?【END】
總結
以上是生活随笔為你收集整理的c语言实现 windows socket_C语言实现Socket简单通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [云炬创业学笔记]第一章创业是什么测试1
- 下一篇: 串行口通信c语言代码,问一下单片机串行口