101 網路程式設計之socket實踐

2021-08-18 13:13:05 字數 4150 閱讀 3234

埠號:其實實質就是乙個數字編號,用來在一台電腦主機中,主機的作業系統中,唯一標識乙個能上網的程序,當前os中是唯一的,跟ip位址會一起投入到每乙個資料報中

ip位址精確到某一台電腦

埠號精確到這台電腦的哪乙個程序

所以ip位址和埠號是打包在一起不分家的,這兩個是同時具備才能工作的,

bind 是把當前的電腦的ip 埠號跟socket繫結起來

listen就是用來監聽的

伺服器的**

#include #include /* see notes */

#include #include #include #define svrport 6003

#define srvaddr "192.168.0.102" //ifconfig 看到的

#define backlog 10

int main(void)

; struct sockaddr_in clnaddr = ;

socklen_t len = 0;

sockfd = socket(af_inet, sock_stream, 0);

if(sockfd < 0)

printf("sockfd = %d.\n", sockfd);

//然後,bind繫結sockfd和(ip + 埠號)

srvaddr.sin_family = af_inet; //設定位址族為ipv4

srvaddr.sin_port = htons(svrport);//設定位址的埠號

srvaddr.sin_addr.s_addr = inet_addr(srvaddr);//設定ip位址

ret = bind(sockfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));

if(ret < 0)

//第三步 listen 監聽埠 監聽當前的埠號的埠

ret = listen(sockfd, backlog);//阻塞等待監聽伺服器

if(ret < 0)

//第四步 阻塞等待客戶端接入

ret = accept(sockfd, (struct sockaddr *)&clnaddr, &len);

printf("hahaha ret = %d.\n", ret);

return 0;

}

客戶端的**

#include #include /* see notes */

#include #include #include #define srvaddr "192.168.0.102" //伺服器開放給我們的ip位址和埠號

#define svrport 6003

int main(void);

sockfd = socket(af_inet, sock_stream, 0);

if(sockfd < 0)

printf("sockfd = %d.\n", sockfd);

//然後,connect連線伺服器

srvaddr.sin_family = af_inet; //設定位址族為ipv4

srvaddr.sin_port = htons(svrport);//設定位址的埠號

srvaddr.sin_addr.s_addr = inet_addr(srvaddr);//設定ip位址

ret = connect(sockfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));

if(ret < 0)

printf("connect rst ret = %d.\n", ret);

return 0;

}

accept是阻塞的,返回值是fd,為連線新建的fd,accept能正確返回說明fd伺服器與客戶端建立連線了,讀寫操作就由accept返回了,以後的read write send recieve 都是基於這個

socket返回的fd是監聽檔案描述符,是描述監聽客戶端的過程,不能用來讀寫

accept返回的fd叫做連線fd,是鏈結之後伺服器和客戶端讀寫的描述符

客戶端傳送伺服器接收  伺服器**

#include #include /* see notes */

#include #include #include #define svrport 7003

#define srvaddr "192.168.43.162" //ifconfig 看到的

#define backlog 10

char buf[100] = ;

int main(void)

; struct sockaddr_in clnaddr = ;

socklen_t len = 0;

sockfd = socket(af_inet, sock_stream, 0);

if(sockfd < 0)

printf("sockfd = %d.\n", sockfd);

//然後,bind繫結sockfd和(ip + 埠號)

srvaddr.sin_family = af_inet; //設定位址族為ipv4

srvaddr.sin_port = htons(svrport);//設定位址的埠號

srvaddr.sin_addr.s_addr = inet_addr(srvaddr);//設定ip位址

//bind(sockfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));

ret = bind(sockfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));

if(ret < 0)

//第三步 listen 監聽埠 監聽當前的埠號的埠

ret = listen(sockfd, backlog);//阻塞等待監聽伺服器

if(ret < 0)

//第四步 阻塞等待客戶端接入

ret = accept(sockfd, (struct sockaddr *)&clnaddr, &len);

printf("hahaha ret = %d.\n", ret);

recv(ret, buf, sizeof(buf), 0);

printf("rec %s\n", buf);

return 0;

}

客戶端**

#include #include /* see notes */

#include #include #include #include #define srvaddr "192.168.43.162" //伺服器開放給我們的ip位址和埠號

#define svrport 7003

char buf[100] = ;

int main(void);

sockfd = socket(af_inet, sock_stream, 0);

if(sockfd < 0)

printf("sockfd = %d.\n", sockfd);

//然後,connect連線伺服器

srvaddr.sin_family = af_inet; //設定位址族為ipv4

srvaddr.sin_port = htons(svrport);//設定位址的埠號

srvaddr.sin_addr.s_addr = inet_addr(srvaddr);//設定ip位址

ret = connect(sockfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));

if(ret < 0)

printf("connect rst ret = %d.\n", ret);

strcpy(buf, "hello world!");

ret = send(sockfd, buf, strlen(buf), 0);

printf("num is %d\n", ret);

return 0;

}

Java基礎 14 網路程式設計之socket

socket有兩種協議通訊方式 分別為tcp和udp。tcp協議通訊 tcp協議是一種可靠協議,即使網路暫時阻塞,tcp也能保持通訊的可靠性。服務端 public class socketservertest catch ioexception e 客服端 public class socketcl...

網路程式設計2 網路程式設計之位元組序

1.什麼是位元組序 位元組序是指多位元組資料在計算機記憶體中儲存或者網路傳輸時各位元組的儲存順序。2.常見的位元組序 a little endian 將低序位元組儲存在起始位址 小端位元組序 b big endian 將高序位元組儲存在起始位址 大端位元組序 例子1 在記憶體中雙字0x0102030...

網路程式設計之socket

套接字 socket 是乙個抽象層,應用程式可以通過它傳送或接收資料,可對其進行像對檔案一樣的開啟 讀寫和關閉等操作。套接字允許應用程式將i o插入到網路中,並與網路中的其他應用程式進行通訊。網路套接字是ip位址與埠的組合。套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 unix...