socket 网络 编程
網(wǎng)絡(luò)編程場景
自己是客戶端站在5棟樓前,自己要找到5棟樓中的一座并進(jìn)入某一間房間,這時(shí)第二座樓上有人在用漢語(tcp/udp)說話,我的ip地址(樓號)是…,我的端口號(房間號)是…,就是先告訴你你的ip地址和端口號,確定你的服務(wù)器在哪里,然后回房間監(jiān)聽(等待大家的來訪,來了敲門)
Socket服務(wù)器和客戶端的開發(fā)步驟
服務(wù)器開發(fā)
第一步
socket()獲得一個(gè)套接字,返回套接字的描述符,后面都是基于這個(gè)描述符向外面進(jìn)行網(wǎng)絡(luò)訪問,這個(gè)作用有點(diǎn)像open()
第二步
bind()為套接字添加信息,將ip地址和端口號綁定到套接字。
第三步
listen()監(jiān)聽網(wǎng)絡(luò)連接
第四步
accept()監(jiān)聽到有客戶端接入的時(shí)候,接受一個(gè)連接。
第五步
數(shù)據(jù)交互(read從網(wǎng)絡(luò)通道上讀數(shù)據(jù),write向網(wǎng)絡(luò)通道發(fā)數(shù)據(jù))
第六步
關(guān)閉套接字,斷開連接。
客戶端開發(fā)
socket()給客戶端一個(gè)通道,知道IP地址和端口號調(diào)用connect()連接,然后客戶端write服務(wù)端read,服務(wù)端write客戶端read。
linux提供的API簡析
1、創(chuàng)建套接字時(shí)指定用哪種協(xié)議進(jìn)行連接
2、地址準(zhǔn)備好
地址轉(zhuǎn)換API
4、監(jiān)聽
4、連接
數(shù)據(jù)收發(fā)
數(shù)據(jù)的收發(fā)第二套API
客戶端connect函數(shù)
字節(jié)序轉(zhuǎn)換API
查找結(jié)構(gòu)體方法
-nir中 n表示顯示行號,i表示不區(qū)分大小寫,r表示逐行掃描
socket服務(wù)端代碼演示
#include<stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> //#include<linux/in.h> #include <arpa/inet.h> #include<stdlib.h> #include<netinet/in.h>int main() {int s_fd;int n_read;char readbuf[128];char*msg="I have get your messange";//1.sockets_fd=socket(AF_INET,SOCK_STREAM,0);//AF_INET表示IPV4因特網(wǎng)域,SOCK_STREAM表示TCP協(xié)議if(s_fd==-1){perror("socket");//打印錯(cuò)誤exit(-1);}struct sockaddr_in s_addr;struct sockaddr_in c_addr;memset(&s_addr,0,sizeof(struct sockaddr_in));memset(&c_addr,0,sizeof(struct sockaddr_in));s_addr.sin_family=AF_INET;//IPV4因特網(wǎng)域s_addr.sin_port=htons(8988);//htons將字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序inet_aton("192.168.183.128",&s_addr.sin_addr);//sin_addr是ip地址//2.bindbind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//3.listenlisten(s_fd,10);int clen=sizeof(struct sockaddr_in);//4.acceptint c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);//這里的c_fd就是接下來的操作對象,s_fd繼續(xù)等待其他客戶端的接入,accept的第二個(gè)參數(shù)是接入服務(wù)器者的信息if(c_fd==-1){perror("accept");}printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));//打印接入客戶端的IP地址//5.readn_read=read(c_fd,readbuf,128);if(n_read ==-1){perror("read");}else{printf("get message :%d,%s\n",n_read,readbuf);}//6.writewrite(c_fd,msg,strlen(msg));return 0; }socket客戶端代碼演示
#include<stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> //#include<linux/in.h> #include <arpa/inet.h> #include<stdlib.h> #include<netinet/in.h>int main() {int c_fd;int n_read;char* readbuf;readbuf=(char *)malloc(128);char*msg="message from client";//1.socketc_fd=socket(AF_INET,SOCK_STREAM,0);if(c_fd==-1){perror("socket");exit(-1);}struct sockaddr_in c_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));c_addr.sin_family=AF_INET;c_addr.sin_port=htons(8988);inet_aton("192.168.183.128",&c_addr.sin_addr);//2.connectif(connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr_in))==-1){perror("connect");exit(-1);}//3.sendwrite(c_fd,msg,strlen(msg));//4.readn_read=read(c_fd,readbuf,128);if(n_read ==-1){perror("read");}else{printf("get message from server:%d,%s\n",n_read,readbuf);}return 0; }總結(jié)
以上是生活随笔為你收集整理的socket 网络 编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#txt文本分割器
- 下一篇: 基于微信小程序的学习网站源码