天天看點

linux建立socket程序,Linux 網絡程式設計詳解二(socket建立流程、多程序版)

netstat -na | grep "" --檢視TCP/IP協定連接配接狀态

//socket程式設計提高版--伺服器

#include

#include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args[])

{

int sockfd = socket(AF_INET, SOCK_STREAM, );

if (sockfd == -)

{

perror("socket() err");

return -;

}

//位址複用

int on = ;

if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -)

{

perror("setsockopt() err");

return -;

}

//

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons();

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

//表示綁定任意一個位址(但是不推薦,最好使用本機ip位址)

//addr.sin_addr.s_addr=INADDR_ANY;

if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -)

{

perror("bind() err");

return -;

}

if (listen(sockfd, SOMAXCONN) == -)

{

perror("bind() err");

return -;

}

struct sockaddr_in peeraddr;

socklen_t peerlen = sizeof(peeraddr);

int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);

if (conn == -)

{

perror("accept() err");

return -;

}

printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));

char recvbuf[] = { };

while ()

{

int rc = read(conn, recvbuf, sizeof(recvbuf));

if (rc == )

{

printf("client is closed !\n");

break;

} else if (rc < )

{

printf("read() failed ! error message:%s\n", strerror(errno));

break;

}

printf("recv message:%s\n", recvbuf);

write(conn, recvbuf, rc);

memset(recvbuf, , sizeof(recvbuf));

}

close(conn);

close(sockfd);

return ;

}

//socket程式設計提高版--用戶端

#include

#include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args[])

{

int sockfd = socket(AF_INET, SOCK_STREAM, );

if (sockfd == -)

{

perror("socket() err");

return -;

}

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons();

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

if (connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -)

{

perror("socket() err");

return -;

}

char sendbuf[]={};

char recvbuf[]={};

while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)

{

//send

write(sockfd,sendbuf,sizeof(sendbuf));

//recv

int rc=read(sockfd,recvbuf,sizeof(recvbuf));

if(rc

{

perror("read() error");

break;

}else if(rc==)

{

printf("connect is cloesd !\n");

break;

}

printf("recv message:%s\n",recvbuf);

memset(sendbuf,,sizeof(sendbuf));

memset(recvbuf,,sizeof(recvbuf));

}

return ;

}

//socket程式設計提高版--多程序版伺服器

#include

#include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args[])

{

int sockfd = socket(AF_INET, SOCK_STREAM, );

if (sockfd == -)

{

perror("socket() err");

return -;

}

//位址複用

int on = ;

if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -)

{

perror("setsockopt() err");

return -;

}

//

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons();

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

//表示綁定任意一個位址(但是不推薦,最好使用本機ip位址)

//addr.sin_addr.s_addr=INADDR_ANY;

if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -)

{

perror("bind() err");

return -;

}

if (listen(sockfd, SOMAXCONN) == -)

{

perror("bind() err");

return -;

}

//int conn = 0;

while ()

{

struct sockaddr_in peeraddr;

socklen_t peerlen = sizeof(peeraddr);

int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);

if (conn == -)

{

perror("accept() err");

return -;

}

printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));

int pid = fork();

if (pid == -)

{

perror("fork() err");

break;

}

if (pid == )

{

char recvbuf[] = { };

while ()

{

int rc = read(conn, recvbuf, sizeof(recvbuf));

if (rc == )

{

printf("client is closed !\n");

break;

} else if (rc < )

{

printf("read() failed ! error message:%s\n",

strerror(errno));

break;

}

printf("recv message:%s\n", recvbuf);

write(conn, recvbuf, rc);

memset(recvbuf, , sizeof(recvbuf));

}

close(conn);

close(sockfd);

exit();

} else

{

close(conn);

}

}

close(sockfd);

return ;

}

TCP&sol;UDP Linux網絡程式設計詳解

本文主要記錄TCP/UDP網絡程式設計的基礎知識,采用TCP/UDP實作主控端和目标機之間的網絡通信. 内容目錄 1. 目标2.Linux網絡程式設計基礎2.1 嵌套字2.2 端口2.3 網絡位址2.3.1 ...

Linux 網絡程式設計詳解九

TCP/IP協定中SIGPIPE信号産生原因 .假設用戶端socket套接字close(),會給伺服器發送位元組段FIN: .伺服器接收到FIN,但是沒有調用close(),因為socket有緩存區,所 ...

Linux 網絡程式設計詳解三(p2p點對點聊天)

//p2p點對點聊天多程序版--伺服器(信号的使用) #include #include #include

Linux 網絡程式設計詳解五(TCP&sol;IP協定粘包解決方案二)

ssize_t recv(int s, void *buf, size_t len, int flags); --與read相比,隻能用于網絡套接字檔案描述符 --當flags參數的值設定為MSG_P ...

Linux 網絡程式設計詳解十二

UDP的特點 --無連接配接 --基于消息的資料傳輸服務 --不可靠 --UDP更加高效 UDP注意點 --UDP封包可能會丢失,重複 --UDP封包可能會亂序 --UDP缺乏流量控制(UDP緩沖區寫滿之 ...

Linux 網絡程式設計詳解七(并發僵屍程序處理)

在上一篇程式架構中,解決了子程序退出,父程序繼續存在的功能,但是多條用戶端連接配接如果同一時間并行退出,導緻伺服器端多個子程序同一時間全部退出,而SIGCHLD是不可靠信号,同時來多條信号可能無法處理,導 ...

Linux 網絡程式設計詳解四(流協定與粘包)

TCP/IP協定是一種流協定,流協定是位元組流,隻有開始和結束,包與包之間沒有邊界,是以容易産生粘包,但是不會丢包. UDP/IP協定是資料報,有邊界,不存在粘包,但是可能丢包. 産生粘包問題的原因 . ...

Linux 網絡程式設計詳解一(IP套接字結構體、網絡位元組序,位址轉換函數)

IPv4套接字位址結構 struct sockaddr_in { uint8_t sinlen;(4個位元組) sa_family_t sin_family;(4個位元組) in_port_t sin_p ...

Linux 網絡程式設計詳解十一

/** * read_timeout - 讀逾時檢測函數,不含讀操作 * @fd:檔案描述符 * @wait_seconds:等待逾時秒數,如果為0表示不檢測逾時 * 成功傳回0,失敗傳回-1,逾時返 ...

随機推薦

第15章 裝置無關位圖&lowbar;15&period;1 DIB檔案格式

15.1 DIB檔案格式(一種檔案格式,擴充名為BMP) 15.1.1 OS/2風格的DIB 檔案格式 字段 說明 檔案頭 (BITMAPFILEHEADER) 1.共14個位元組 2.縮寫建議用bmf ...

RequireJS和AMD規範

目錄 概述 define方法:定義子產品 require方法:調用子產品 AMD模式小結 配置require.js:config方法 插件 優化器r.js 參考連結 概述 RequireJS是一個工具庫, ...

codeforce 421D D&period; Bug in Code

題目連結: http://codeforces.com/problemset/problem/421/D D. Bug in Code time limit per test 1 secondmemo ...

【BZOJ】【1003】【ZJOI2006】物流運輸trans

最短路/DP 這題資料規模并不大!!這是重點……… 是以直接暴力DP就好了:f[i]表示前 i 天的最小花費,則有$f[i]=min\{f[j]+cost[j+1][i]+k\} (0\leq j \ ...

Spring Security Encryption三種加密方式

Encryption One-way encryption       單項加密,用戶端将要傳遞的值先加密(使用特定的加密方法),将原值和加密好的值傳遞過去,伺服器端将原始資料也進行一次加密(兩者加密 ...

檢視ORACLE 資料庫及表資訊

-- 檢視ORACLE 資料庫中本使用者下的所有表 SELECT table_name FROM user_tables; -- 檢視ORACLE 資料庫中所有使用者下的所有表 select user,t ...

IP位址爬取

ip_spider.py= = = #!/usr/bin/python # coding: utf-8 import os import sys import requests import re i ...

python中的指派和深淺拷貝

python中,A object  = B object  是一種指派操作,賦的值不是一個對象在記憶體中的空間,而隻是這個對象在記憶體中的位置 . 此時當B對象裡面的内容發生更改的時候,A對象也自然而然的 ...

使用Docker搭建簡易的 Java Web 環境

![group_5622_0](http://ow20g4tgj.bkt.clouddn.com/2017-09-10-group_5622_0.png) 從[

Python報錯:IndentationError&colon; expected an indented block

sum = 0 for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: sum = sum + x print(sum) 代碼如上,但是運作報錯: 發現是因為少了縮進,改正 ...