導航:首頁 > 編程系統 > linuxsocketsendto

linuxsocketsendto

發布時間:2021-12-07 10:55:42

linux socket 設置從哪個網路設備發送數據 SO

原因: 1、 因為伺服器是時時在監聽有沒有客戶端的連接,如果伺服器不綁定IP和埠的話,客戶端上線的時候怎麼連到伺服器呢,所以伺服器要綁定IP和埠,而客戶端就不需要了,客戶端上線是主動向伺服器發出請求的,因為伺服器已經綁定了IP和埠,所以客戶端上線的就向這個IP和埠發出請求,這時因為客戶開始發數據了(發上線請求),系統就給客戶端分配一個隨機埠,這個埠和客戶端的IP會隨著上線請求一起發給伺服器,服務收到上線請求後就可以從中獲起發此請求的客戶的IP和埠,接下來伺服器就可以利用獲起的IP和埠給客戶端回應消息了。 2、採用UDP通信 1)若有客戶端和伺服器之分的程序,創建sock後即可在該socket上用recvfrom/sendto方法發送接受數據了,因為客戶端只需要用sendto發送數據到指定的地址,當然若是bind了,程序也沒什麼問題,區別就是系統用默認自動bind()指定你自己的socket參數地址(特別是在指定特定埠的UDP對等通信)只是這種情況沒有這樣用的。 那UDP伺服器是怎麼知道客戶端的IP地址和UDP埠? 一般來說有兩種方式: 一種是客戶端發消息顯式地告訴伺服器IP地址和埠,消息內容就包括IP地址和UDP埠。 另外一種就是隱式的,伺服器從收到的包的頭部中得到包的源IP地址和埠。 2)若是沒有客戶端和伺服器之分的程序,即自己指定特定埠的UDP對等通信,則客戶端和伺服器都需要bind()IP地址和埠了。 通常udp服務端根本不需要知道客戶端的socket,它直接建立一個socket用於發送即可,udp通信的關鍵只在於IP和埠。 多個客戶端如果需要點到點分發,必須給服務端socket循環設置每個客戶端的IP並發出,但更常用的是廣播分發,服務端socket設定一個X.X.X.255的廣播地址並始終向它發送,每個客戶端建立的socket只需要綁定這個廣播地址便可以收到。 客戶端用不用bind 的區別 無連接的socket的客戶端和服務端以及面向連接socket的服務端通過調用bind函數來配置本地信息。使用bind函數時,通過將my_addr.sin_port置為0,函數會自動為你選擇一個未佔用的埠來使用。 Bind()函數在成功被調用時返回0;出現錯誤時返回"-1"並將errno置為相應的錯誤號。需要注意的是,在調用bind函數時一般不要將埠號置為小於1024的值,因為1到1024是保留埠號,你可以選擇大於1024中的任何一個沒有被佔用的埠號。 有連接的socket客戶端通過調用Connect函數在socket數據結構中保存本地和遠端信息,無須調用bind(),因為這種情況下只需知道目的機器的IP地址,而客戶通過哪個埠與伺服器建立連接並不需要關心,socket執行體為你的程序自動選擇一個未被佔用的埠,並通知你的程序數據什麼時候打開埠。(當然也有特殊情況,linux系統中rlogin命令應當調用bind函數綁定一個未用的保留埠號,還有當客戶端需要用指定的網路設備介面和埠號進行通信等等) 總之: 1.需要在建連前就知道埠的話,需要 bind 2.需要通過指定的埠來通訊的話,需要 bind 具體到上面那兩個程序,本來用的是TCP,客戶端就不用綁定埠了,綁定之後只能運行一個client 的程序,是屬於自己程序中人為設定的障礙,而從伺服器那邊得到的客戶機連接埠號(是系統自動分配的)與這邊客戶機綁定的埠號根本是不相關的,所以客戶 綁定也就失去了意義。 注意: 一個埠可以用於多個連接(比如多個客戶端連接伺服器的同一埠)。但是在同一個操作系統上,即伺服器和客戶端都是本機上,多個客戶端去連接伺服器,只有第一個客戶端的連接會被接收,第二個客戶端的連接請求不會被接收。 首先,伺服器和客戶端都可以bind,bind並不是伺服器的專利。 客戶端進程bind埠: 由進程選擇一個埠去連伺服器,(如果默認情況下,調用bind函數時,內核指定的埠是同一個,那麼運行多個調用了bind 的client 程序,會出現埠被佔用的錯誤)注意這里的埠是客戶端的埠。如果不分配就表示交給內核去選擇一個可用埠。 客戶端進程bind IP地址:相當於為發送出去的IP數據報分配了源IP地址,但交給進程分配IP地址的時候(就是這樣寫明了bind IP地址的時候)這個IP地址必須是主機的一個介面,不能分配一個不存在的IP。如果不分配就表示由內核根據所用的輸出介面來選擇源IP地址。 一般情況下客戶端是不用調用bind函數的,一切都交給內核搞定! 服務端進程bind埠:基本是必須要做的事情,比如一個伺服器啟動時(比如freebsd),它會一個一個的捆綁眾所周知的埠來提供服務,同樣,如果bind了一個埠就表示我這個伺服器會在這個埠提供一些「特殊服務」。 服務端進程bind IP地址:目的是限制了服務端進程創建的socket只接受那些目的地為此IP地址的客戶鏈接,一般一個伺服器程序里都有 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是針對IP4,IP6代碼不太一樣 這樣一句話,意思就是:我不指定客戶端的IP,隨便連,來者不拒! 總之只要你bind時候沒有指定哪一項(置為0),內核會幫你選擇。

Ⅱ linux socket sendto可以不設地址嗎

需要設地址的,即使是廣播,不然怎麼知道數據包發給誰:
addr.sin_addr=htonl(INADDR_ANY) ;

Ⅲ linux socket編程我用sendto發包有沒有長度限制的

linux socket編程我用sendto發包有沒有長度限制的
引發非法操作異常的原因有:

應用程序試圖對Parent屬性為nil的組件進行一些需要窗口句柄的操作.
試圖對窗體拖放操作.

引發組件異常的原因有:
Delphi不能注冊某個組件

應用程序不能重命名某個組件
資源不足異常被引發是由於當應用程序試圖創建窗口句柄而操作系統沒有多餘的句柄可分配

專用組件異常:許多組件都定義了相應的組件異常類.

Ⅳ linux socket 怎樣拿到 client 命令參數

你直接傳過來好了。
就是通過sendto等命令直接寫過來。

Ⅳ 拔下網線,linux下sendto還能發送成功,why

這個問題關鍵在於,你用的udp服務,而不是tcp服務。

udp是無連接的,tcp是有連接的。

這個是關鍵,udp是只管發而不在意網路環境是什麼樣的。

其實你發送成功了,但是具體消息應該還在你機器網卡的緩沖區里。

再連接上網線,它會自動給你發出去的。

但是每個UDP包都有一個最長保存時間的。

一旦超過這個時間,它將會消失。

Ⅵ linux 網路編程 sendto 問題

sendto(經socket傳送數據)
相關函數 send , sendmsg,recv , recvfrom , socket

表頭文件 #include < sys/types.h >
#include < sys/socket.h >

定義函數 int sendto ( int s , const void * msg, int len, unsigned int flags, const
struct sockaddr * to , int tolen ) ;

函數說明 sendto() 用來將數據由指定的socket傳給對方主機。參數s為已建好連線的socket,如果利用UDP協議則不需經過連線操作。參數msg指向欲連線的數據內容,參數flags 一般設0,詳細描述請參考send()。參數to用來指定欲傳送的網路地址,結構sockaddr請參考bind()。參數tolen為sockaddr的結果長度。

返回值 成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno 中。

錯誤代碼 EBADF 參數s非法的socket處理代碼。
EFAULT 參數中有一指針指向無法存取的內存空間。
WNOTSOCK canshu s為一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此動作會令進程阻斷,但參數s的soket為補課阻斷的。
ENOBUFS 系統的緩沖內存不足。
EINVAL 傳給系統調用的參數不正確。

範例 #include < sys/types.h >
#include < sys/socket.h >
# include <netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345 /*使用的port*/
main(){
int sockfd,len;
struct sockaddr_in addr;
char buffer[256];
/*建立socket*/
if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){
perror (「socket」);
exit(1);
}
/*填寫sockaddr_in 結構*/
bzero ( &addr, sizeof(addr) );
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr=hton1(INADDR_ANY) ;
if (bind(sockfd, &addr, sizeof(addr))<0){
perror(「connect」);
exit(1);
}
while(1){
bezro(buffer,sizeof(buffer));
len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);
/*顯示client端的網路地址*/
printf(「receive from %s\n 「 , inet_ntoa( addr.sin_addr));
/*將字串返回給client端*/
sendto(sockfd,buffer,len,0,&addr,addr_len);」
}
}

Ⅶ Windows和Linux下socket的區別

下面大概分幾個方面進行羅列:

Linux要包含

[cpp]
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
等頭文件,而windows下則是包含
[cpp]
#include <winsock.h>


Linux中socket為整形,Windows中為一個SOCKET。
Linux中關閉socket為close,Windows中為closesocket。
Linux中有變數socklen_t,Windows中直接為int。
因為linux中的socket與普通的fd一樣,所以可以在TCP的socket中,發送與接收數據時,直接使用read和write。而windows只能使用recv和send。
設置socet選項,比如設置socket為非阻塞的。Linux下為

[cpp]
flag = fcntl (fd, F_GETFL);
fcntl (fd, F_SETFL, flag | O_NONBLOCK);
,Windows下為
[cpp]
flag = 1;
ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);

當非阻塞socket的TCP連接正在進行時,Linux的錯誤號為EINPROGRESS,Windows的錯誤號為WSAEWOULDBLOCK。

file
Linux下面,文件換行是"\n",而windows下面是"\r\n"。
Linux下面,目錄分隔符是"/",而windows下面是"\"。
Linux與Windows下面,均可以使用stat調用來查詢文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。為了支持更大的文件查詢,可以在Linux環境下加

_FILE_OFFSET_BITS=64定義,在Windows下面使用_stat64調用,入參為struct __stat64。
Linux中可根據stat的st_mode判斷文件類型,有S_ISREG、S_ISDIR等宏。Windows中沒有,需要自己定義相應的宏,如

[cpp]
#define S_ISREG(m) (((m) & 0170000) == (0100000))
#define S_ISDIR(m) (((m) & 0170000) == (0040000))
Linux中刪除文件是unlink,Windows中為DeleteFile。

time

Linux中,time_t結構是長整形。而windows中,time_t結構是64位的整形。如果要在windows始time_t為32位無符號整形,可以加宏定義,_USE_32BIT_TIME_T。
Linux中,sleep的單位為秒。Windows中,Sleep的單位為毫秒。即,Linux下sleep (1),在Windows環境下則需要Sleep (1000)。
Windows中的timecmp宏,不支持大於等於或者小於等於。
Windows中沒有struct timeval結構的加減宏可以使用,需要手動定義:

[cpp]
#define MICROSECONDS (1000 * 1000)

#define timeradd(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec + (t2)->tv_usec % MICROSECONDS; \
if ((t1)->tv_usec + (t2)->tv_usec > MICROSECONDS) (t3)->tv_sec ++; \
} while (0)

#define timersub(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec - (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec - (t2)->tv_usec; \
if ((t1)->tv_usec - (t2)->tv_usec < 0) (t3)->tv_usec --, (t3)->tv_usec += MICROSECONDS; \
} while (0)

調用進程

Linux下可以直接使用system來調用外部程序。Windows最好使用WinExec,因為WinExec可以支持是打開還是隱藏程序窗口。用WinExec的第二個入參指明,如

SW_SHOW/SW_HIDE。

雜項

Linux為srandom和random函數,Windows為srand和rand函數。
Linux為snprintf,Windows為_snprintf。
同理,Linux中的strcasecmp,Windows為_stricmp。

錯誤處理

Linux下面,通常使用全局變數errno來表示函數執行的錯誤號。Windows下要使用GetLastError ()調用來取得。

Linux環境下僅有的
這些函數或者宏,Windows中完全沒有,需要用戶手動實現。
atoll

[cpp]
long long
atoll (const char *p)
{
int minus = 0;
long long value = 0;
if (*p == '-')
{
minus ++;
p ++;
}
while (*p >= '0' && *p <= '9')
{
value *= 10;
value += *p - '0';
p ++;
}
return minus ? 0 - value : value;
}
gettimeofday

[cpp]
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define EPOCHFILETIME 11644473600000000Ui64
#else
#define EPOCHFILETIME 11644473600000000ULL
#endif

struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};

int
gettimeofday (struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
LARGE_INTEGER li;
__int64 t;
static int tzflag;

if (tv)
{
GetSystemTimeAsFileTime (&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
t = li.QuadPart; /* In 100-nanosecond intervals */
t -= EPOCHFILETIME; /* Offset to the Epoch time */
t /= 10; /* In microseconds */
tv->tv_sec = (long) (t / 1000000);
tv->tv_usec = (long) (t % 1000000);
}

if (tz)
{
if (!tzflag)
{
_tzset ();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}

return 0;
}

編譯相關
當前函數,Linux用__FUNCTION__表示,Windows用__func__表示。
--------------------------------------------------------------------------------
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
-----------------------------------------------------------------
windows與linux平台使用的socket均繼承自Berkeley socket(rfc3493),他們都支持select I/O模型,均支持使用getaddrinfo與getnameinfo實現協議無關編程。但存在細微差別,

主要有:

頭文件及類庫。windows使用winsock2.h(需要在windows.h前包含),並要鏈接庫ws2_32.lib;linux使用netinet/in.h, netdb.h等。
windows下在使用socket之前與之後要分別使用WSAStartup與WSAClean。
關閉socket,windows使用closesocket,linux使用close。
send*與recv*函數參數之socket長度的類型,windows為int,linux為socklen_t,可預編譯指令中處理這一差異,當平台為windows時#define socklen_t unsigned int。
select函數第一個參數,windows忽略該參數,linux下該參數表示集合中socket的上限值,一般設為sockfd(需select的socket) + 1。
windows下socket函數返回值類型為SOCKET(unsigned int),其中發生錯誤時返回INVALID_SOCKET(0),linux下socket函數返回值類型int, 發生錯誤時返回-1。
另外,如果綁定本機回環地址,windows下sendto函數可以通過,linux下sendto回報錯:errno=22, Invalid arguement。一般情況下均綁定通配地址。

Ⅷ Linux上sendto偶爾需要很長時間才返回是什麼原因

在linux的網路編程,特別是TCP的編程中,SIGPIPE信號錯誤是一個比較常見的問題,我猜測你是在使用TCP的socket吧,如果是這樣的話,很有可能是你在向一個已經處於關閉狀態的socket寫數據,因為TCP是面向連接的協議。如果對方將socket給close掉了,而你還繼續往這個 socket寫數據,就會觸發這個信號。 因此,建議你在write之前檢查一下對方是否已經close掉了這個socket。 如果回答得不對,可以繼續追問哈

Ⅸ linux下socket 網路編程(客戶端向伺服器端發送文件) 求源代碼 大哥大姐幫幫忙 ,。。謝謝

不知道是樓下還是樓上,他用的事windows的套接字貌似,不過過程是一回樣的,在Linux下面使用的函數名答字不同罷了,客戶端向伺服器端發送文件,過程其實很簡單:
1.客戶端向伺服器端發送傳輸文件的請求(可攜帶一些所傳文件的大小之類的基本信息);
2.伺服器端接收請求(根據文件信息看是否能夠接受請求);
3.客戶端發送文件(如果接收到server的yes響應,那麼就傳送);
4.伺服器端接收文件(寫入到指定目錄的文件夾);

你需要先簡單了解過程,在弄清除Linux下面對socket的操作(其實就類似於對文件的操作)。

如果實在自己寫不出可以:email:[email protected]

Ⅹ socket編程在windows和linux下的區別

下面大概分幾個方面進行羅列:

Linux要包含

[cpp]
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
等頭文件,而windows下則是包含
[cpp]
#include <winsock.h>


Linux中socket為整形,Windows中為一個SOCKET。
Linux中關閉socket為close,Windows中為closesocket。
Linux中有變數socklen_t,Windows中直接為int。
因為linux中的socket與普通的fd一樣,所以可以在TCP的socket中,發送與接收數據時,直接使用read和write。而windows只能使用recv和send。
設置socet選項,比如設置socket為非阻塞的。Linux下為

[cpp]
flag = fcntl (fd, F_GETFL);
fcntl (fd, F_SETFL, flag | O_NONBLOCK);
,Windows下為
[cpp]
flag = 1;
ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);

當非阻塞socket的TCP連接正在進行時,Linux的錯誤號為EINPROGRESS,Windows的錯誤號為WSAEWOULDBLOCK。

file
Linux下面,文件換行是"\n",而windows下面是"\r\n"。
Linux下面,目錄分隔符是"/",而windows下面是"\"。
Linux與Windows下面,均可以使用stat調用來查詢文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。為了支持更大的文件查詢,可以在Linux環境下加

_FILE_OFFSET_BITS=64定義,在Windows下面使用_stat64調用,入參為struct __stat64。
Linux中可根據stat的st_mode判斷文件類型,有S_ISREG、S_ISDIR等宏。Windows中沒有,需要自己定義相應的宏,如

[cpp]
#define S_ISREG(m) (((m) & 0170000) == (0100000))
#define S_ISDIR(m) (((m) & 0170000) == (0040000))
Linux中刪除文件是unlink,Windows中為DeleteFile。

time

Linux中,time_t結構是長整形。而windows中,time_t結構是64位的整形。如果要在windows始time_t為32位無符號整形,可以加宏定義,_USE_32BIT_TIME_T。
Linux中,sleep的單位為秒。Windows中,Sleep的單位為毫秒。即,Linux下sleep (1),在Windows環境下則需要Sleep (1000)。
Windows中的timecmp宏,不支持大於等於或者小於等於。
Windows中沒有struct timeval結構的加減宏可以使用,需要手動定義:

[cpp]
#define MICROSECONDS (1000 * 1000)

#define timeradd(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec + (t2)->tv_usec % MICROSECONDS; \
if ((t1)->tv_usec + (t2)->tv_usec > MICROSECONDS) (t3)->tv_sec ++; \
} while (0)

#define timersub(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec - (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec - (t2)->tv_usec; \
if ((t1)->tv_usec - (t2)->tv_usec < 0) (t3)->tv_usec --, (t3)->tv_usec += MICROSECONDS; \
} while (0)

調用進程

Linux下可以直接使用system來調用外部程序。Windows最好使用WinExec,因為WinExec可以支持是打開還是隱藏程序窗口。用WinExec的第二個入參指明,如

SW_SHOW/SW_HIDE。

雜項

Linux為srandom和random函數,Windows為srand和rand函數。
Linux為snprintf,Windows為_snprintf。
同理,Linux中的strcasecmp,Windows為_stricmp。

錯誤處理

Linux下面,通常使用全局變數errno來表示函數執行的錯誤號。Windows下要使用GetLastError ()調用來取得。

Linux環境下僅有的
這些函數或者宏,Windows中完全沒有,需要用戶手動實現。
atoll

[cpp]
long long
atoll (const char *p)
{
int minus = 0;
long long value = 0;
if (*p == '-')
{
minus ++;
p ++;
}
while (*p >= '0' && *p <= '9')
{
value *= 10;
value += *p - '0';
p ++;
}
return minus ? 0 - value : value;
}
gettimeofday

[cpp]
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define EPOCHFILETIME 11644473600000000Ui64
#else
#define EPOCHFILETIME 11644473600000000ULL
#endif

struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};

int
gettimeofday (struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
LARGE_INTEGER li;
__int64 t;
static int tzflag;

if (tv)
{
GetSystemTimeAsFileTime (&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
t = li.QuadPart; /* In 100-nanosecond intervals */
t -= EPOCHFILETIME; /* Offset to the Epoch time */
t /= 10; /* In microseconds */
tv->tv_sec = (long) (t / 1000000);
tv->tv_usec = (long) (t % 1000000);
}

if (tz)
{
if (!tzflag)
{
_tzset ();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}

return 0;
}

編譯相關
當前函數,Linux用__FUNCTION__表示,Windows用__func__表示。
--------------------------------------------------------------------------------
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
-----------------------------------------------------------------
windows與linux平台使用的socket均繼承自Berkeley socket(rfc3493),他們都支持select I/O模型,均支持使用getaddrinfo與getnameinfo實現協議無關編程。但存在細微差別,

主要有:

頭文件及類庫。windows使用winsock2.h(需要在windows.h前包含),並要鏈接庫ws2_32.lib;linux使用netinet/in.h, netdb.h等。
windows下在使用socket之前與之後要分別使用WSAStartup與WSAClean。
關閉socket,windows使用closesocket,linux使用close。
send*與recv*函數參數之socket長度的類型,windows為int,linux為socklen_t,可預編譯指令中處理這一差異,當平台為windows時#define socklen_t unsigned int。
select函數第一個參數,windows忽略該參數,linux下該參數表示集合中socket的上限值,一般設為sockfd(需select的socket) + 1。
windows下socket函數返回值類型為SOCKET(unsigned int),其中發生錯誤時返回INVALID_SOCKET(0),linux下socket函數返回值類型int, 發生錯誤時返回-1。
另外,如果綁定本機回環地址,windows下sendto函數可以通過,linux下sendto回報錯:errno=22, Invalid arguement。一般情況下均綁定通配地址。
轉載jlins

閱讀全文

與linuxsocketsendto相關的資料

熱點內容
小苮有聲小說 瀏覽:987
win10企業版更新失敗 瀏覽:94
ios代碼怎麼實現內存清理 瀏覽:952
允熙雪作品集 瀏覽:287
被總裁打手心 瀏覽:565
鬼片免費推薦 瀏覽:601
文件名後面有3怎麼去掉 瀏覽:658
linuxfstab掛載 瀏覽:750
mac版本qq怎麼改密碼錯誤 瀏覽:553
define組合一般用於頭文件中 瀏覽:165
電影里有個叫大衛的男主角 瀏覽:584
三陰僵屍電影的別名 瀏覽:703
DP 電影 瀏覽:979
有部電影講8個人分娩鏡頭 瀏覽:129
ps4文件夾怎麼加封面 瀏覽:444
網站開發怎麼選擇 瀏覽:446
魅族root升級 瀏覽:46
送快遞電影賣內衣 瀏覽:691
電信網路怎麼繳費 瀏覽:423
杜文澤電影日本 瀏覽:312

友情鏈接