導航:首頁 > 編程語言 > linuxcsocket編程實例

linuxcsocket編程實例

發布時間:2023-03-24 19:39:22

linux下C語言Socket編程問題(高手進)

網路斷開如拔掉網線時,系統程序一般是檢測不出來的,尤其是廣域網上。

建議連接時設置linger屬性,如果網路不通,能迅速決斷立即返回失敗錯誤。
LINGER oLinger;
oLinger.l_onoff = 1;
oLinger.l_linger = 0;
setsockopt(m_Socket,SOL_SOCKET,SO_LINGER,(char *)&oLinger,sizeof(oLinger));

❷ 設計一個linux c語言,Http協議的伺服器,用socket收發消息,簡單點,求代碼and注釋。

OK
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char *argv[])
{
int sockfd,new_socket;
int sock_value;
char buf[] = "hello! China!I Love You\n";

struct sockaddr_in client_;
struct sockaddr_in server_;

int SIZE = sizeof(struct sockaddr_in);

if(argc != 2){
fprintf(stderr,"The two number!\n");
exit(1);
}

if((sock_value = atoi(argv[1])) < 0){
fprintf(stderr,"socket error!\n");
exit(1);
}

if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1){
perror("socket");
exit(1);
}

bzero(&server_,SIZE);

server_.sin_family = PF_INET;
server_.sin_port = htons(sock_value);
server_.sin_addr.s_addr = INADDR_ANY;

if(bind(sockfd,(struct sockaddr *)(&server_),SIZE) == -1){
perror("bind");
exit(1);
}

if(listen(sockfd, 12) == -1){
perror("listen");
exit(1);
}

printf("Waiting ... ...\n");

while(1){
if((new_socket = accept(sockfd,(struct sockaddr *)(&client_),&SIZE)) == -1){
perror("accept");
exit(1);
}

printf("The client IP is %s\n",inet_ntoa(client_.sin_addr));
printf("The socket is %d\n",ntohs(client_.sin_port));

if(write(new_socket,buf,strlen(buf)) == -1){
perror("write");
exit(1);
}

int my;
char mybuf[1024];

if((my = read(new_socket, mybuf,1024)) == -1){
perror("read");
exit(1);
}

mybuf[my] = '\0';
printf("#++++#++++#:%s\n",mybuf);

close(new_socket);

}

close(sockfd);

return 0;
}

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
int sockfd;
int sock_value;
char buf[1024];
char mybuf[] = "Linux\n";
int read_count;

struct sockaddr_in client_;
struct sockaddr_in server_;

int SIZE = sizeof(struct sockaddr_in);

if(argc != 3){
fprintf(stderr,"The two number!\n");
exit(1);
}

if((sock_value = atoi(argv[2])) < 0){
fprintf(stderr,"socket error!\n");
exit(1);
}

if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1){
perror("socket");
exit(1);
}

bzero(&client_,SIZE);
bzero(&server_,SIZE);

client_.sin_family = PF_INET;
client_.sin_port = htons(52252);
client_.sin_addr.s_addr = INADDR_ANY;

server_.sin_family = PF_INET;
server_.sin_port = htons(sock_value);
server_.sin_addr.s_addr = inet_addr(argv[1]);

if(connect(sockfd,(struct sockaddr *)(&server_),SIZE) == -1){
perror("connect");
exit(1);
}

if((read_count = read(sockfd,buf,1024)) == -1){
perror("read");
exit(1);
}

buf[read_count] = '\0';
printf("#----#----#:%s\n",buf);

if(write(sockfd, mybuf,6) == -1){
perror("write");
exit(1);
}

close(sockfd);

exit(0);

return 0;
}

❸ socket,linux用c語言實現

不難吧,我給你說下流程
客戶端
1、創建socket套接子s
2、用s連接到服務端,connect這個函數,成功返回0,錯誤 -1;
3、可以發送和接收數據,看你是面向連接還是無連接的了,具體的你自己處理
服務端
1、創建socket,比如s
2、綁定埠和本級IP。bind
3、listen。監聽埠
4、accept,接受服務端連接,如果成功的話會返回一個新套接字的,比如s1,你可以利用s1和客戶端進行通信,接收和發送和客戶端的一樣

還有需要提醒的是,你使用面向無連接的時候客戶端和服務端差不多是一樣的工作流程,都和上邊服務端工作模式一樣

❹ 關於linux環境C語言socket編程基礎的問題

你這個服務端的邏輯有問題(當然也可以說是客戶端邏輯有問題,這是相對的)。
客戶端使用的是長連接,也就是一次連接,多次通話。而服務端則是短連接,一次連接,一次通話,然後就斷開了。
想實現你的需求很 簡單,把服務端的accept放在while的外面就可以了。
但你這個代碼不完整,最後沒有關閉句柄的語句,應該把這些內容補充完整。良好的編碼習慣,要把打開的文件、句柄,分配的內存等,都關閉、釋放掉。不要想著程序結束會自動釋放。

❺ 求linux socket網路編程代碼

Linux是多任務的操作系統,可在運行在Intel 80386及更高檔次的PC機、ARMS、MIPS和PowerPC等多種計算機平台,已成為應用廣泛、可靠性高、功能強大的計算機操作系統,Linux具有內核小、效率高、源代碼開放等優點,還內含了TCP/IP網路協議,很適合在伺服器領域使用,而伺服器主要用途之一就是進行網路通信,隨著計算機辦公自動化處理技術的應用與推廣,網路的不斷普及,傳統的紙張式文件傳輸方式已經不再適合發展的需要,人們更期待一種便捷、高效、環保、安全的網路傳輸方式.

協議概述TCP/IP即傳輸控制協議/網路協議[1](Transmission Control Protocol/Internet Protocol),是一個由多種協議組成的協議族,他定義了計算機通過網路互相通信及協議族各層次之間通信的規范,圖1描述了Linux對IP協議族的實現機制[2]。

Linux支持BSD的套接字和全部的TCP/IP協議,是通過網路協議將其視為一組相連的軟體層來實現的,BSD套接字(BSD Socket)由通用的套接字管理軟體支持,該軟體是INET套接字層,用來管理基於IP的TCP與UDP埠到埠的互聯問題,從協議分層來看,IP是網路層協議,TCP是一個可靠的埠到埠的傳輸層協議,他是利用IP層進行傳接報文的,同時也是面向連接的,通過建立一條虛擬電路在不同的網路間傳輸報文,保證所傳輸報文的無丟失性和無重復性。用戶數據報文協議(User Datagram Protocol,UDP)也是利用IP層傳輸報文,但他是一個非面向連接的傳輸層協議,利用IP層傳輸報文時,當目的方網際協議層收到IP報文後,必須識別出該報文所使用的上層協議(即傳輸層協議),因此,在IP報頭上中,設有一個"協議"域(Protocol)。通過該域的值,即可判明其上層協議類型,傳輸層與網路層在功能說的最大區別是前者提供進程通信能力,而後者則不能,在進程通信的意義上,網路通信的最終地址不僅僅是主機地址,還包括可以描述進程的某種標識符,為此,TCP/UDP提出了協議埠(Protocol Port)的概念,用於標識通信的進程,例如,Web伺服器進程通常使用埠80,在/etc/services文件中有這些注冊了的埠地址。

對於TCP傳輸,傳輸節點間先要建立連接,然後通過該連接傳輸已排好序的報文,以保證傳輸的正確性,IP層中的代碼用於實現網際協議,這些代碼將IP頭增加到傳輸數據中,同時也把收到的IP報文正確的傳送到TCP層或UDP層。TCP是一個面向連接協議,而UDP則是一個非面向連接協議,當一個UDP報文發送出去後,Linux並不知道也不去關心他是否成功地到達了目的的主機,IP層之下,是支持所有Linux網路應用的網路設備層,例如點到點協議(Point to Point Protocol,PPP)和乙太網層。網路設備並非總代表物理設備,其中有一些(例如回送設備)則是純粹的軟體設備,網路設備與標準的Linux設備不同,他們不是通過Mknod命令創建的,必須是底層軟體找到並進行了初始化之後,這些設備才被創建並可用。因此只有當啟動了正確設置的乙太網設備驅動程序的內核後,才會有/dev/eth0文件,ARP協議位於IP層和支持地址解析的協議層之間。

網路通信原理所有的網路通信就其實現技術可以分為兩種,線路交換和包交換,計算機網路一般採用包交換,TCP使用了包交換通信技術,計算機網路中所傳輸的數據,全部都以包(Packet)這個單位來發送,包由"報頭"和"報文"組成,結構如圖2所示,在"報頭"中記載有發送主機地址,接收主機地址及與報文內容相關的信息等,在"報文"中記載有需要發送的數據,網路中的每個主機和路由器中都有一個路由定址表,根據這個路由表,包就可以通過網路傳送到相應的目的主機。

網路通信中的一個非常重要的概念就是套接字(Socket)[3,4],簡單地說,套接字就是網路進程的ID,網路通信歸根到底是進程的通信,在網路中,每個節點有一個網路地址(即IP地址),兩個進程通信時,首先要確定各自所在網路節點的網路地址,但是,網路地址只能確定進程所在的計算機,而一台計算機上可能同時有多個網路進程,還不能確定到底是其中的哪個進程,由此套接字中還要有其他的信息,那就是埠號(Port),在一台計算機中,一個埠一次只能分配給一個進程,即埠號與進程是一一對應的關系,所以,埠號和網路地址就能唯一地確定Internet中的一個網路進程。可以認為:套接字=網路地址+埠號系統調用一個Socket()得到一個套接字描述符,然後就可以通過他進行網路通信了。

套接字有很多種類,最常用的就有兩種;流式套接字和數據報套接字。在Linux中分別稱之為"SOCK_STREAM"和"SOCK_DGRAM)"他們分別使用不同的協議,流式套接字使用TCP協議,數據報套接字使用UDP協議,本文所使用的是流式套接字協議。

網路通信原理在文件傳輸程序設計中的應用網路上的絕大多數通信採用的都是客戶機/伺服器機制(Client/Server),即伺服器提供服務,客戶是這些服務的使用者,伺服器首先創建一個Socket,然後將該Socket與本地地址/埠號綁定(Bind()),成功之後就在相應的Socket上監聽(Listen()) 。當Accept()函數捕捉到一個連接服務(Connect())請求時,接受並生成一個新的Socket,並通過這個新的Socket與客戶端通信,客戶端同樣也要創建一個Socket,將該Socket與本地地址/埠號綁定,還需要指定伺服器端的地址與埠號,隨後向伺服器端發出Connect(),請求被伺服器端接受後,可以通過Socket與伺服器端通信。

TCP是一種面向連接的、可靠的、雙向的通信數據流,說他可靠,是因為他使用3段握手協議傳輸數據,並且在傳輸時採用"重傳肯定確認"機制保證數據的正確發送:接收端收到的數據後要發出一個肯定確認,而發送端必須要能接受到這個肯定信號,否則就要將數據重發。在此原理基礎之上,設計了基於Linux操作系統下TCP/IP編程實現文件傳輸的實例。我們採用客戶機/伺服器模式通信時,通信雙方發送/接收數據的工作流程如圖3所示。

文件傳輸就是基於客戶機/伺服器模型而設計的,客戶機和伺服器之間利用TCP建立連續,因文件傳輸是一個互動式會話系統,客戶機每次執行文件傳輸,都需要與伺服器建立控制連接和數據連接,其中控制連接負責傳輸控制信息、利用控制命令、客戶機可以向伺服器提出無限次的請求,客戶機每次提出的請求,伺服器與客戶機建立一個數據連接,進行實際的數據傳輸,數據傳輸完畢後,對應的數據連接被清除,控制連接依然保持,等待客戶機發出新的傳輸請求,直到客戶機撤銷控制連接,結束會話。

當進行文件傳輸時,首先向伺服器發出連接請求,伺服器驗證身份後,與客戶端建立連接,雙方進入會話狀態,這時只要客戶端向伺服器端發出數據連接請求,建立起數據連接後,雙方就進入數據傳輸狀態,數據傳輸完畢後,數據連接被撤銷,如此循環反復,直到會話結束,從而實現將文件從伺服器端傳輸至客戶機端。

文件傳輸程序設計流程[5,客戶端的TCP應用程序流程(1)先用Socket()創建本地套介面,給伺服器端套介面地址結構賦值。

(2)用Connect()函數使本地套介面向伺服器端套介面發出建立連接請求,經3次握手建立TCP連接。

(3)用Read()函數讀取所要接收的文件名以及存放在內存里的文件內容。

(4)用Open()函數打開客戶端新建立的目標文件,如果沒有建立,該函數會自動生成目標文件,等待存放文件內容。

(5)最後用Write()函數將讀取的文件內容存放在新的目標文件中,以實現伺服器端向客戶端的文件傳輸。

(6)通信結束,用Close()關閉套介面,停止接收文件。

伺服器端的TCP應用程序流程(1)先用Open()函數打開等待傳輸的可讀文件;(2)用Socket()創建套介面,並給套介面地址結構賦值;(3)用Bind()函數綁定套介面;(4)用Listen()函數在該套介面上監聽請求;(5)用Accept()函數接受請求,產生新的套介面及描述字,並與客戶端連接;(6)用Lseek()函數是為了在每次接受客戶機連接時,將用於讀的源文件指針移到文件頭;(7)用Read()函數讀取一定長度的源文件數據;(8)最後用Write()函數將讀取的源文件數據存放在內存中,以便客戶端讀取;(9)傳輸完畢時,用Close()關閉所有進程,結束文件傳輸。

結語Linux操作系統在網路應用方面具有很強的開發潛力,同時Linux也是可靠性、安全性非常高的系統,因此在基於TCP/IP網路通信的研究與開發中,通常選用Linux操作系統作為開發平台

❻ Linux下Socket編程 怎樣實現客戶端之間互相通信

  1. 網路的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。

  2. 下面用Socket實現一個windows下的c語言socket通信例子,這里我們客戶端傳遞一個字元串,伺服器端進行接收。

【伺服器端】
#include"stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#include<winsock2.h>
#defineSERVER_PORT5208//偵聽埠
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
intret,nLeft,length;
SOCKETsListen,sServer;//偵聽套接字,連接套接字
structsockaddr_insaServer,saClient;//地址信息
char*ptr;//用於遍歷信息的指針
//WinSock初始化
wVersionRequested=MAKEWORD(2,2);//希望使用的WinSockDLL的版本
ret=WSAStartup(wVersionRequested,&wsaData);
if(ret!=0)
{
printf("WSAStartup()failed! ");
return;
}
//創建Socket,使用TCP協議
sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sListen==INVALID_SOCKET)
{
WSACleanup();
printf("socket()faild! ");
return;
}
//構建本地地址信息
saServer.sin_family=AF_INET;//地址家族
saServer.sin_port=htons(SERVER_PORT);//注意轉化為網路位元組序
saServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//使用INADDR_ANY指示任意地址

//綁定
ret=bind(sListen,(structsockaddr*)&saServer,sizeof(saServer));
if(ret==SOCKET_ERROR)
{
printf("bind()faild!code:%d ",WSAGetLastError());
closesocket(sListen);//關閉套接字
WSACleanup();
return;
}

//偵聽連接請求
ret=listen(sListen,5);
if(ret==SOCKET_ERROR)
{
printf("listen()faild!code:%d ",WSAGetLastError());
closesocket(sListen);//關閉套接字
return;
}

printf("Waitingforclientconnecting! ");
printf("Tips:Ctrl+ctoquit! ");
//阻塞等待接受客戶端連接
while(1)//循環監聽客戶端,永遠不停止,所以,在本項目中,我們沒有心跳包。
{
length=sizeof(saClient);
sServer=accept(sListen,(structsockaddr*)&saClient,&length);
if(sServer==INVALID_SOCKET)
{
printf("accept()faild!code:%d ",WSAGetLastError());
closesocket(sListen);//關閉套接字
WSACleanup();
return;
}
charreceiveMessage[5000];
nLeft=sizeof(receiveMessage);
ptr=(char*)&receiveMessage;
while(nLeft>0)
{
//接收數據
ret=recv(sServer,ptr,5000,0);
if(ret==SOCKET_ERROR)
{
printf("recv()failed! ");
return;
}
if(ret==0)//客戶端已經關閉連接
{
printf("Clienthasclosedtheconnection ");
break;
}
nLeft-=ret;
ptr+=ret;
}
printf("receivemessage:%s ",receiveMessage);//列印我們接收到的消息。

}
//closesocket(sListen);
//closesocket(sServer);
//WSACleanup();
}
【客戶端】
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<winsock2.h>
#defineSERVER_PORT5208//偵聽埠
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
intret;
SOCKETsClient;//連接套接字
structsockaddr_insaServer;//地址信息
char*ptr;
BOOLfSuccess=TRUE;
//WinSock初始化
wVersionRequested=MAKEWORD(2,2);//希望使用的WinSockDLL的版本
ret=WSAStartup(wVersionRequested,&wsaData);
if(ret!=0)
{
printf("WSAStartup()failed! ");
return;
}
//確認WinSockDLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("InvalidWinSockversion! ");
return;
}
//創建Socket,使用TCP協議
sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sClient==INVALID_SOCKET)
{
WSACleanup();
printf("socket()failed! ");
return;
}
//構建伺服器地址信息
saServer.sin_family=AF_INET;//地址家族
saServer.sin_port=htons(SERVER_PORT);//注意轉化為網路節序
saServer.sin_addr.S_un.S_addr=inet_addr("192.168.1.127");
//連接伺服器
ret=connect(sClient,(structsockaddr*)&saServer,sizeof(saServer));
if(ret==SOCKET_ERROR)
{
printf("connect()failed! ");
closesocket(sClient);//關閉套接字
WSACleanup();
return;
}


charsendMessage[]="hellothisisclientmessage!";
ret=send(sClient,(char*)&sendMessage,sizeof(sendMessage),0);
if(ret==SOCKET_ERROR)
{
printf("send()failed! ");
}
else
printf("clientinfohasbeensent!");
closesocket(sClient);//關閉套接字
WSACleanup();
}

❼ 在linux下如何用c語言來寫一個socket編程的聊天小程序

源碼如下:
//chat_one.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <malloc.h>
#include <sys/select.h>

int main( int argc, char **argv)
{
struct sockaddr_in chatone, chattwo;
char pmsg[1000];
char *buf;
int chatone_fd;
int ret,i;
int len, msg_len;
fd_set fdset;

if ( argc < 2 ){
printf("please input ip address\n");
return -1;
}

printf("server address is %s\n", argv[1]);

chattwo.sin_family = AF_INET;
chattwo.sin_port = htons(60002);
inet_pton(AF_INET, argv[1], &chattwo.sin_addr.s_addr);

chatone.sin_family = AF_INET;
chatone.sin_port = htons(60000);
chatone.sin_addr.s_addr = INADDR_ANY;

chatone_fd = socket(PF_INET, SOCK_DGRAM, 0);
if ( -1 == chatone_fd ){
printf("create socket failed %s\n", strerror(errno));
return -1;
}

ret = bind(chatone_fd, (struct sockaddr *)&chatone, sizeof(chatone));
if ( -1 == ret){
printf("bind failed %s \n", strerror(errno));
return -1;
}

for(i=0; i<1000;i++){
FD_ZERO( &fdset );
FD_SET ( 0, &fdset);
FD_SET( chatone_fd, &fdset);

if ( -1 == select ( chatone_fd+1, &fdset, NULL, NULL, NULL) ){
continue;
}

if ( FD_ISSET( chatone_fd, &fdset)){
recvfrom( chatone_fd, pmsg, 999, 0, NULL, 0);
printf("receive %s\n", pmsg);
}
else{
memset( pmsg, 0, 1000);
fgets(pmsg, 999, stdin);
len = sizeof(chattwo);
sendto( chatone_fd, pmsg, 1000, 0,\
(struct sockaddr*) &chattwo, len);

printf("send %s\n", pmsg);
}
}

printf("sent %d packets\n", i);

close(chatone_fd);
return 0;
}
//chat_two.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <malloc.h>
#include <sys/select.h>

int main( int argc, char **argv)
{
struct sockaddr_in chatone, chattwo;
char pmsg[1000];
char *buf;
int chattwo_fd;
int ret,i;
int len, msg_len;
fd_set fdset;

if ( argc < 2 ){
printf("please input ip address\n");
return -1;
}

printf("server address is %s\n", argv[1]);

chattwo.sin_family = AF_INET;
chattwo.sin_port = htons(60002);
chattwo.sin_addr.s_addr = INADDR_ANY;

chatone.sin_family = AF_INET;
chatone.sin_port = htons(60000);
inet_pton(AF_INET, argv[1], &chatone.sin_addr.s_addr);

chattwo_fd = socket(PF_INET, SOCK_DGRAM, 0);
if ( -1 == chattwo_fd ){
printf("create socket failed %s\n", strerror(errno));
return -1;
}

ret = bind(chattwo_fd, (struct sockaddr *)&chattwo, sizeof(chattwo));
if ( -1 == ret){
printf("bind failed %s \n", strerror(errno));
return -1;
}

for(i=0; i<1000;i++){
FD_ZERO( &fdset );
FD_SET ( 0, &fdset);
FD_SET( chattwo_fd, &fdset);

if ( -1 == select ( chattwo_fd+1, &fdset, NULL, NULL, NULL) ){
continue;
}

if ( FD_ISSET( chattwo_fd, &fdset)){
recvfrom( chattwo_fd, pmsg, 999, 0, NULL, 0);
printf("receive: %s\n", pmsg);
}
else{
memset( pmsg, 0, 1000);
fgets(pmsg, 999, stdin);
len = sizeof(chatone);
sendto( chattwo_fd, pmsg, 1000, 0,\
(struct sockaddr*) &chatone, len);

printf("send %s\n", pmsg);
}
}

printf("sent %d packets\n", i);

close(chattwo_fd);
return 0;
}
編譯好這個兩個程序就可以進行簡單的通信了。

❽ linux下C語言socket編程雙機互發數據

這個問題很好辦啦,伺服器接受一個連接請求,然後開一個線程或者進程都可以,再在線程或者進程裡面採用其他技術實現同時收發(比如I/O復用,比如非阻塞I/O)。客戶端也可以採用I/O復用。

推薦資料的話,《unix網路編程》這本書很好,公認的經典,當教科書用,這本書里有你想要的所有內容。

ps:你基礎太差,多補補吧,別想一下吃個胖子。

另外我這里正好有個例子滿足你的要求,貼給你,自己寫的,不是網上找的,用的是多進程加I/O復用技術:

server端:
/****************************************************************
**
**
**
****************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>

#define BUFLEN 1024
#define MAX(a,b) ((a)>(b)?(a):(b))

typedef void Sigfunc (int);

void str_echo(FILE *,int);
//Sigfunc *signal(int, Sigfunc *);

int main(int argc,char **argv)
{
int connfd,listenfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
void sig_chld(int);

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(5358);

bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(listenfd,8);

signal(SIGCHLD,sig_chld);

while(1)
{
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen)) < 0)
{
if(errno == EINTR)
{
fputs("accept error: EINTR\n",stdout);
continue;
}
else
{
fputs("accept error..\n",stdout);
}
}

if((childpid = fork()) == 0)
{
close(listenfd);
str_echo(stdin,connfd);
exit(0);
}
close(connfd);
}
}

void str_echo(FILE *fp,int sockfd)
{
int n = 0;
char sendbuf[BUFLEN] = { 0 },recvbuf[BUFLEN] = { 0 };
int maxfdp;
fd_set rset;

FD_ZERO(&rset);

while(1)
{
FD_SET(fileno(fp),&rset);
FD_SET(sockfd, &rset);
maxfdp = MAX(fileno(fp),sockfd)+1;

select(maxfdp, &rset ,NULL, NULL, NULL);

if(FD_ISSET(sockfd, &rset))
{
if(n = read(sockfd, recvbuf, BUFLEN) == 0)
{
return;
}
if(n == -1)
{
break;
}
printf("%s\n",recvbuf);
memset(recvbuf,0,BUFLEN);
}
if(FD_ISSET(fileno(fp),&rset))
{
scanf("%s",sendbuf);
write(sockfd, sendbuf,strlen(sendbuf));
}
}
}

void sig_chld (int signo)
{
pid_t pid;
int stat;

while ((pid = waitpid(-1,&stat, WNOHANG)) > 0)
{
printf("child %d terminated\n",pid);
}
return;
}

client端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

#define MAX(a,b) (a)>(b)?(a):(b)

int main()
{
int s,connectReturn, maxfd;
fd_set rset;
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
long port=5358;
s=socket(PF_INET,SOCK_STREAM,0);

struct sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr("127.0.0.1");
sa.sin_port=htons(port);
connectReturn=connect(s,(struct sockaddr *)&sa,sizeof(sa));
printf("%d\n",connectReturn);
FD_ZERO(&rset);
while(1)
{
FD_SET(fileno(stdin), &rset);
FD_SET(s, &rset);
maxfd=MAX(fileno(stdin), s) + 1;

select(maxfd, &rset, NULL, NULL, NULL);
if(FD_ISSET(fileno(stdin), &rset))
{
scanf("%s",sendbuf);
send(s,sendbuf,strlen(sendbuf),0);
bzero(sendbuf, 1024);
}
else if(FD_ISSET(s, &rset))
{
memset(recvbuf,0,1024);
recv(s,recvbuf,1024,0);
printf("remote: %s\n",recvbuf);
}
}
return 0;
}

❾ linux下C語言用socket網路編程怎麼計算傳輸速度

這要你的通信程序協商一個協議,比如定義一個通信結構體,傳文件的時候,一開始發送結構體的信息過去,告訴對端你的文件總大小,然後,傳輸過程中,統計已經收到或者發送的數據,做個除法就得到速率了。

具體這類協商,你可以自己隨便想,也可以借鑒現有的比較好的一些設計,有些考慮斷點續傳的技術,還有壓縮的,看你代碼也不需要考慮吧。

閱讀全文

與linuxcsocket編程實例相關的資料

熱點內容
燕窩國內加工溯源碼 瀏覽:98
李采潭老師電影 瀏覽:979
javabyte與運算 瀏覽:467
scratch編程星星獵手游戲 瀏覽:432
錢站app怎麼用 瀏覽:570
毒app怎麼分期免息 瀏覽:63
歐美恐怖片地下機械怪物 瀏覽:825
寶媽看片網 瀏覽:326
安娜兒子的朋友 瀏覽:583
有一部電影 女的乳孔超級大 叫什麼名字 瀏覽:463
蘇州零基礎怎麼學編程序 瀏覽:291
無人機App怎麼應用 瀏覽:375
s/1LGf5g6I0YPWhleH_k_6oHg?pwd=lyxq lyxq 瀏覽:979
pws1711編程軟體下載 瀏覽:885
逛淘寶為什麼顯示伺服器出錯了 瀏覽:801
洋蔥的貨物溯源碼從哪裡查詢 瀏覽:128
壓縮包和解壓 瀏覽:348
楊凡孫娜哪免費閱讀 瀏覽:332
網站小電影 瀏覽:761
傢具廠做傢具怎麼編程 瀏覽:779