導航:首頁 > 編程語言 > linux的socket編程詳解

linux的socket編程詳解

發布時間:2023-03-26 20:32:07

A. linux C語言編程,socket實現的即使通訊系統

Socket通信創建步驟:

(1)通過socket()函數創建socket
(2)通過bind函數綁定socket於設備地址
(3)進行讀寫操作read/recv/recvfrom write/send/sendto
(4)close方法關閉套接字


例子如下:

test1.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>

intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket ");
exit(-1);
}
printf("socketfd=%d ",fd);

//buildconnectionaddress
structsockaddr_inaddr;
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");

intr;
r=bind(fd,(structsockaddr*)&addr,sizeof(addr));
if(r==-1)
{
perror("bind");
close(fd);
exit(-1);
}
printf("bindaddresssuccessful! ");
//acceptorsendmessage
charbuf[255];
structsockaddr_infrom;
socklen_tlen;
len=sizeof(from);
塵梁空while(1)
{
r=recvfrom(fd,buf,sizeof(buf)-1,0,(structsockaddr*)&from,&len);
if(r>0)
{
buf[r]=0;
printf("Themessagefrom%sis:%s ",inet_ntoa(from.sin_addr),buf);
}
else
{
break;
}
}
//closesocket
close(fd);
return0;
}

test2.c

java">#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket");
exit(-1);
}
printf("createsocketOK! ");
//createansendaddress
structsockaddr_inaddr={};
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//
intr;
派瞎charbuf[255];
while(1)
{
r=read(0,buf,sizeof(buf)-1);
if(r<=0)
break;
sendto(fd,buf,r,0,(structsockaddr*)&addr,sizeof(addr));
}
//closesocket
渣凳close(fd);
return0;
}

先運行test1.c,然後運行test2.c,在test2.c運行後輸入內容,在test1.c所在終端中就會顯示信息

運行結果如下:

B. Windows Socket和Linux Socket編程的區別 ZZ

socket相關程序從Windows移植到Linux下需要注意的:
1)頭文件
Windows下winsock.h/winsock2.h
Linux下sys/socket.h
錯誤處理:errno.h
2)初始化
Windows下需要用WSAStartup
Linux下不需要
3)關閉socket
Windows下closesocket(...)
Linux下close(...)
4)類型
Windows下SOCKET
Linux下int
如我用到的一些宏:
#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif
#ifdef __Linux__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#endif
5)獲取錯誤碼
Windows下getlasterror()/WSAGetLastError()
Linux下errno變數
6)設置非阻塞
Windows下ioctlsocket()
Linux下fcntl() <fcntl.h>
7)send函數最後一個參數
Windows下一般設置為0
Linux下最好設置為MSG_NOSIGNAL,如果不設置,在發送出錯後有可 能會導致程序退出。
8)毫秒級時間獲取
Windows下GetTickCount()
Linux下gettimeofday()
3、多線程
多線程: (win)process.h --〉(Linux)pthread.h
_beginthread --> pthread_create
_endthread --> pthread_exit
一、linux下的socket編程:
1、客戶端執行步驟依次如下:
socket()
connect()
send()或者recv()
close()
注意的是,connect之前要填充地址結構體,IP地址轉換為網路位元組序,一般用inet_aton().
2、伺服器端:
socket()
bind()
listen()
accpet()
recv()或者send()
close()
(ps:一般通過將send()和recv()的最後一個參數賦為0或者1來區分阻塞與非阻塞,其中0對應阻塞,1對應非阻塞)
二、windows下的網路編程:
做過windows網路編程的人都知道,微軟的MFC把復雜的WinSock API函數封裝到類里,這使得編寫網路應用程序更容易。即windows既提供上層的網路API函數也提供底層的API函數。
1、對於採用上層的API函數而言:若採用csocket類定義一個對象obj的話,那麼進行網路編程的步驟如下:
客戶端:
obj.Create()
obj.Connect()
obj.Receive()或者obj.Send()
obj.Close()
伺服器端:
先調用AfxSocketInit()檢測協議棧安裝情況
obj.Create()
obj.Listen()
obj.Accpet()
obj.Receive()或者obj.Send()
obj.Close()
2、對於採用底層的API函數而言,步驟如下:
客戶端:
WSAStartup()
socket()
connect()
send()或者recv()
closesocket()
伺服器端:
WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()
(ps:windows下CSocket類為同步方式,有阻塞現象;CASyncSocket為非同步方式,無阻塞現象。)
通過以上比較可以發現:linux下的網路編程與windows下採用底層的API類似,但是也有區別:
區別一:windows下需加上WSAStartup()函數
區別二:關閉socket:linux為close(),windows為closesocket()
windows下採用上層的API,一般有CSocket和CAsynSocket這兩種類型的類
這種情況以下socket函數一般的首字母大寫。而底層的API不管是windows下的還是linux下的socket函數首字母都是小寫的。

C. linux下socket編程,請大神詳解 serv_addr.sin_addr = *((struct in_addr *)host->h_addr);

-> 是結構體指針變數引用結構體成員變數的方法。

一般結構體引用成員變數用.(點)。
struct stu {
char name[10];
int age ;
} s, *p=s ;

strcpy( s.name , "Jack" );
s.age=20 ;
也可以用指針來操作
strcpy( p->name , "Jack" );
p->age=20 ;
當指向s時,與上面兩句等價。

D. linux下的socket編程在哪進行

LINUX下的SOCKET編程?應該所有語言都有相應的SOCKET編程介面。
C/C++、JAVA,python,RUBY,PERL,甚至是SCEME。
只不過,其他幾種都是跨平台的,不算是單獨的LINUX下SOCKET編程。一般C語言和C++才這么說。因為LINUX下的介面和WINDOWS不一樣。
想知道介面有哪些的話,你得查手冊或是看《UNIX環境高級編程》這類書,書上會有LINUX/UNIX的C編程介面。
編譯環境的話,只要是C語言編譯器,LINUX支持的主要是GCC,LINUX下的開發環境IDE也默認都用GCC了,比如CODEBLOCKS、GEANY什麼的。按下編譯、運行按鈕就行了,和WINDOWS下開發的步驟差不多,只是介面不一樣。
如果要用命令行的話,也不難,代碼寫好了,gcc 一下就可以編譯了。不過,看你的水平,算了吧……要麼安心學一下LINUX下編程,要麼老實地用IDE。

問這種問題,讓人很難回答的……在哪進行,當然在LINUX下,在LINUX的C語言代碼文件里,什麼編譯環境?C語言的編譯環境……什麼編譯工具,C語言的編譯工具,比如GCC。

E. linux socket 編程

這類問題,你不用考慮太復雜的,可以直接使用socket提供的tcp服務介面,通過send和recv等函數處理就行了。數據建議自行寫封裝和解封函數,
介面類似這樣:int pack(char *, struct data *); int unpack(char *, struct data *);
可以按照你自己的喜好,將你的struct按照你的方式填入一個char*裡面(你直接將struct data*類型轉換後賦值給char*類型都行),然後就可以使用介面了;
你完全不用管tcp的實現機制的,tcp有擁塞控制,超時重傳,自動分包等機制,可以保證你的數據按准確的方式送達;
像什麼包的數據頭什麼的,如果你需要定義的是應用層的協議,或者你希望自定義網路層和傳輸層(使用raw方式的socket),你才需要考慮;

F. linux socket編程 麻煩達人給一下程序的注釋

客戶端:
int main()
{ int sockfd;//sokce fd 可以man socket 看socket();這個函數的原型
int len;
struct sockaddr_in address;//connect的函數參數,主要是伺服器的ip和埠
int result;
char ch = `A`;//發送的消息
sockfd = socket(AF_INET,SOCK_STREAM,0); address.sin_family = AF_INET; //創建socket
address.sin_addr.s_addr = inet_addr(「127.0.0.1」);//設置伺服器的ip地址
address.sin_port = 9734;//設置埠
len = sizeof(address); //傳給connect函數的長度

result = connect(sockfd,(struct sockaddr *)&address,len);
if(result == -1) {//連接到伺服器,成功返回0,注意這里是阻塞方式
peror(「oops:client1」);
exit(1); }
write(sockfd,&ch,1); //往伺服器發送消息
read(sockfd,&ch,1);//從伺服器讀回消息,存放到ch
printf(「char from server = c\n」,ch);//讀回的消息,列印
close(sockfd);
exit(0); }

伺服器端:

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

int main()
{ int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(AF_INET,SOCK_STEAM,0);
server_address.sun_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(「127.0.0.1」);
server_address.sin_port = 9734;
server_len = sizeof(server_address);

上面部分從簡
bind(server_sockfd,(struct sockaddr *)&server_address,server_len); //綁定埠和ip,

listen(server_sockfd,5);//運豎伺服器開始監聽埠
while(1){
char ch;
printf(『server waiting\n」);
client_len = sizeof(client_address); client_sockfd = accept(server_sockfd,(struct sockaddr*)
&client_address,&client_len);//開始等待客戶端連接,如果沒有,則阻塞

read(client_sockfd,&ch,1); //建掘拍立一個連接後,從客戶端讀取消息
ch++;//A=>B
write(client_sockfd,&ch,1);//寫回客戶端
close(client_sockfd);}

這是一個簡單測試網路連接的程序,其實如果做服務判悄羨器的話,一般採用的是select +noblocking 或 多線程,線程池,或多進程,進程池。。。
做了個簡單的分析,如果不明白的地方,可以發我郵件[email protected]

G. linux下socket編程中close()函數

只要不用close或fclose,不管把這個socket_fd值存到哪裡,都氏臘旁可以使用。比如:殲橡
int
socket_fd
=
socket(...);
int
socket_x
=
socket_fd;
那麼send(socket_x)和send(socket_fd)結果完全一局李致

H. linux socket編程代碼解析

很簡單的一個socket server端和client端通信程序啊!
server端監聽埠,client主動連接server端,連接上後client端先將student這樣一個結構體數據發送給server端,server端線接受這個結構體數據,然後再向client端發送這個student結構體數據,client端接收。
ok,通信過程完成。

I. socket編程在windows和linux下的區別是什麼

1. 頭文件

windows下winsock.h或winsock2.h


linux下netinet/in.h(大部分都在這兒),unistd.h(close函數在這兒),sys/socket.h(在in.h里已經包含了,可以省了)

2. 初始化

windows下需要用WSAStartup啟動Ws2_32.lib,並態腔且要用衫友#pragma comment(lib,"Ws2_32")來告知編譯器鏈接該lib。


linux下不需要

3. 關閉socket

windows下closesocket(...)


linux下close(...)

4. 類型

windows下SOCKET


linux下int

5. 獲取錯誤碼

windows下getlasterror()/WSAGetLastError()


linux下,未能成功執行的socket操作會返回-1;如果包含了errno.h,就會設置errno變數

6. 設置非阻塞

windows下ioctlsocket()


linux下fcntl(),需要頭文件fcntl.h

7. send函數最後一個參數

windows下一般設置為0


linux下最好設置為MSG_NOSIGNAL,如果不設置,在發或閉槐送出錯後有可能會導致程序退出

8. 毫秒級時間獲取

windows下GetTickCount()


linux下gettimeofday()

J. linux socket編程相關

你再調用一下 getsockopt 看看 SO_REUSEADDR 設置成功了沒有。

閱讀全文

與linux的socket編程詳解相關的資料

熱點內容
sybaseisql命令 瀏覽:181
android權威編程指南pdf 瀏覽:659
哪些軟體屬於加密軟體 瀏覽:644
文件夾75絲什麼意思 瀏覽:468
最便宜sop8單片機 瀏覽:964
圖解周易預測學pdf 瀏覽:418
c盤莫名奇妙多了幾個文件夾 瀏覽:169
貴州花溪門票優惠app哪個好 瀏覽:801
如何說話不會讓人有被命令的感覺 瀏覽:438
哪裡可下載湘工惠app 瀏覽:263
福特python 瀏覽:310
pdf轉換成word表格 瀏覽:351
無線遠端伺服器無響應是什麼意思 瀏覽:670
兩位整數倒序輸出python 瀏覽:781
為什麼我的世界天空伺服器進不去 瀏覽:262
釘釘直播後的視頻如何線上加密 瀏覽:503
聽主的命令 瀏覽:208
全民上雲時代雲伺服器 瀏覽:519
iphone不創建id如何下載app 瀏覽:972
windowsphp擴展安裝 瀏覽:93