當前位置:首頁 » 編程軟體 » 網路編程函數

網路編程函數

發布時間: 2022-12-12 22:33:15

① Qt網路編程out和in函數的意思的用法

out是一個QDataStream 對象,將聲明QByteArray的實例block最為存儲緩沖區,模式為只寫。 同樣你去看代碼in是一個只讀流,將socket中的數據讀出來的功能。in>>的意思是讀出到blocksize中。和iostream很像,out和in都和網路模塊沒任何關系。
為了保證在客戶端能接收到完整的文件,都在數據流的最開始寫入完整文件的大小信息,這樣客戶端就可以根據大小信息來判斷是否接受到了完整的文件。而在 伺服器端,在發送數據時就要首先發送實際文件的大小信息,但是,文件的大小一開始是無法預知的,所以先使用了out<< (quint16) 0;在block的開始添加了一個quint16大小的空間,也就是兩位元組的空間,它用於後面放置文件的大小信息。
然後 out<<tr(「hello Tcp!!!」);輸入實際的文件,這里是字元串。當文件輸入完成後,在使用out.device()->seek(0);返回到block的開 始,加入實際的文件大小信息,也就是後面的代碼,它是實際文件的大小:out<<(quint16) (block.size() – sizeof(quint16));

linux網路編程中socket函數詳細解釋下吧

函數原型:int socket(int family,int type,int protocol); 參數解釋:family指定協議簇,UNIX下(包括linux)有:AF_INET,AF_INET6,AF_LOCAL,AF_ROUTE,AF_KEY,分別是IPv4,IPv6協議,UNIX域協議,路由套介面,密鑰套介面; type指定套介面類型:unix下有四種,分別是:SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET,SOCK_RAW。(流套接字,數據報套接字,有序分組套接字,原始套接字),SOCK_SEQPACKET已很少使用; protocol:IPPROTO_TCP,IPPROTO_UDP,IPPROTO_SCTP,分別是TCP傳輸協議,UDP傳輸協議,SCTP傳輸協議; 函數返回一個非負整數值,類似於文件描述符(linux內核知識),稱之為套介面描述字,簡稱套接字。《Linux就該這么學》這本書,希望你能感受到linux系統和這本書帶給你的好處及幫助。

③ 網路編程中select函數如何接受一個accept事件

#include <winsock.h>

#include <stdio.h>

#define PORT 5150 //埠

#define MSGSIZE 1024 //信息大小

#pragma comment(lib, "ws2_32.lib")

int g_iTotalConn = 0; //連接數量

SOCKET g_CliSocketArr[FD_SETSIZE]; //套接字數組

DWORD WINAPI WorkerThread(LPVOID lpParameter);//線程函數

int main()

{

WSADATA wsaData;

SOCKET sListen, sClient;

SOCKADDR_IN local, client;

int iaddrSize = sizeof(SOCKADDR_IN);

DWORD dwThreadId;

// Initialize Windows socket library

//裝載套接字型檔

WSAStartup(0x0202, &wsaData);

// Create listening socket

//創建套接字

sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Bind

//綁定

local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

local.sin_family = AF_INET;

local.sin_port = htons(PORT);

bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));

// Listen

//監聽

listen(sListen, 3);

// Create worker thread

//創建線程

CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);

while (TRUE)

{

// Accept a connection

//接受一個連接,返回的是客戶套的套接字

sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);

//這里client的SOCKADDR_IN client 中可以取出IP

printf("Accepted client:%s:%d ", inet_ntoa(client.sin_addr), ntohs(client.sin_port));

// Add socket to g_CliSocketArr

//把客戶端套接字放入數組中

g_CliSocketArr[g_iTotalConn++] = sClient;

}

return 0;

}


DWORD WINAPI WorkerThread(LPVOID lpParam)//線程

{

int i;

fd_set fdread;//結構

int ret;

struct timeval tv = {1, 0};//超時時間 SELECT模型中用到的這里是1秒

char szMessage[MSGSIZE];//信息數組,事實上就是個緩沖區

while (TRUE)

{

FD_ZERO(&fdread);//清空fd_set結構

for (i = 0; i < g_iTotalConn; i++)

{

FD_SET(g_CliSocketArr[i], &fdread);//把客戶套接字放到SELECT要求的數組中

}

//**************************************

// We only care read event

//只關心讀的情況

ret = select(0, &fdread, NULL, NULL, &tv);

if (ret == 0)

{

// Time expired 超時

continue;

}

//如果SELECT返回不是0

for (i = 0; i < g_iTotalConn; i++)

{

if (FD_ISSET(g_CliSocketArr[i], &fdread))

{

// A read event happened on g_CliSocketArr[i]

//一個可讀發生在這個套接字上

ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);

//把它讀出到緩沖區

if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))

{

// Client socket closed

//客戶端關閉

printf("Client socket %d closed. ", g_CliSocketArr[i]);

closesocket(g_CliSocketArr[i]);//關閉這個套接字

if (i < g_iTotalConn - 1)

{

//將數組中最後一個套接字挪到當前的位置上

g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];

}

}

else

{

// We received a message from client

//如果以上沒發生,那麼就接收到一個客戶端的信息

szMessage[ret] = '';

//直接回送回去

send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0);

}

}

}

}

return 0;

}


④ 網路編程函數inet_pton()

inet_pton函數能夠處理ipv4和ipv6。

int inet_pton(int af, const char *src, void *dst); 這個函數轉換字元串到網路地址,第一個參數af是地址族,轉換後存在dst中。
af =AF_INET6
src為指向IPV6的地址,,函數將該地址轉換為in6_addr的結構體,並復制在*dst中; 如果函數出錯將返回一個負值,並將errno設置為EAFNOSUPPORT,如果參數af指定的地址族和src格式不對,函數將返回0。

⑤ C語言 網路編程 關於accept函數的問題

你的兩個調用方式最後一個參數,意義完全不同,&addrlen是將addrlen的地址傳給accept(是一個可以寫的變數地址)
而你的後一個,是將sizeof(addr)它是一個常量,一般為4,轉為指針傳給accept,這個地址是不可寫的

⑥ 網路編程>幫我解釋一下這個函數

腳本是取出查詢字元串

假設 URL 地址:index.asp?a=1&b=2&c=3

var strHref=window.location.href; // 取出 URL 地址「index.asp?a=1&b=2&c=3」
var intPos = strHref.indexOf("?"); // 查找 ? 號出現的字元位置
var strRight = strHref.substr(intPos + 1); // 取出 ? 好後面的字元串「a=1&b=2&c=3」

var arrTmp = strRight.split("&"); // 已 & 號分隔數組,得到的結果是 {"a=1", "b=2", "c=3"} 的字元數組

for(var i = 0; i < arrTmp.length; i++)
{
var arrTemp = arrTmp[i].split("=");
if(arrTemp[0].toUpperCase()==strName.toUpperCase()) return arrTemp[1];
// 以 = 好分隔,進一步解析字元串,如:
// a = 1
// b = 2
// c = 3
}
return "";
}

此函數是搜索指定的字元串是否存在與 URL 查詢字元串中,並且獲取它的數值

⑦ Unix網路編程-poll函數

poll函數起源於SVR3,最初局限於流設備。SVR4取消了這種限制,允許poll工作在任何描述符上。poll提供的功能於select類似,不過在處理流設備時,它能夠提供額外的信息。

函數原型:

#include <poll.h>

int  poll( struct  pollfd*  fdarray,  unsigned  long  nfds, int  timeout);

            返回:若有就緒描述符則為其數目,若超時則為0,若出錯則為-1

用於指定測試某個給定描述符fd的條件。

struct  pollfd {

        int    fd;        /* descriptor  to  check */

        short  events;    /* event of  interest  on  fd*/

        short  revent;    /* event  that occurred  on  fd */

};

要測試的條件由events成員指定,函數在相應的revents成員中返回該描述符的狀態。(每個描述符都有兩個變數,一個為調用值,另一個為返回結果,從而避免使用值-結果參數。回想select函數中間三個參數值都是值-結果參數。)這兩個成員中的每一個都由指定某個特定條件的一位或多位構成。下圖列車了用於指定events標志以及測試revents標志的一些常值。

我們將該圖分為三個部分:第一部分處理輸入的四個常值,第二部分處理輸出的三個常值,第三部分處理錯誤的三個常值。其中第三部分的三個常值不能在events中設置,但是當相應條件存在時就在revents中返回。

poll識別三類數據:普通(normal)、優先順序帶(priority band)和高優先順序(high  priority)。這些術語均出自基於流的實現。

就TCP和UDP套接字而言,以下條件引起poll返回特定的revent。不幸的是,POSIX在其poll的定義中留了許多空洞(也就是說有許多方法可返回相同的條件)。

1) 所有正規tcp數據和所有udp數據都被認為是普通數據。

2) tcp的帶外數據被認為優先順序帶數據。

3) 當tcp連接的讀半部關閉時(譬如收到了一個來自對端的FIN),也被認為是普通數據,隨後的讀操作將返回0。

4) tcp連接存在錯誤即可認為是普通數據,也可以認為是錯誤(POLLERR)。無論哪種情況,隨後的讀操作將返回-1,並把errno設置成合適的值。這可用於處理諸如接收到RST和發生超時等條件。

5) 在監聽套接字上有新的連接可用既可認為是普通數據,也可以認為是優先順序數據。大多數實現視之為普通數據。

6) 非阻塞式connect的完成被認為是使相應套接字可寫。

結構數組中元素的個數是由nfds參數指定。

timeout參數指定poll函數返回前等待多長時間。他是一個指定應等待毫秒數的正值。下圖給出了他的可能取值。

INFTIM常值被定義為一個負值。如果系統不能提供毫秒級精度的定時器,該值就向上舍入到最接近的支持的值。

當發生錯誤時,poll函數的返回值為-1,若定時器到時之前沒有任何描述符就緒,則返回0,否則返回就緒描述符的個數,即revents成員值非0的描述符個數。

如果我們不再關心某個特定描述符,那麼可以把他對應的pollfd結構的fd成員設置成一個負值。poll函數將忽略這樣的pollfd結構的events成員,返回時將他的revents成員的值置為0。

⑧ 網路編程中close函數和shutdown函數的區別

close與shutdown的區別主要表現在:
close函數會關閉套接字ID,如果有其他的進程共享著這個套接字,那麼它仍然是打開的,這個連接仍然可以用來讀和寫,並且有時候這是非常重要的 ,特別是對於多進程並發伺服器來說。
而shutdown會切斷進程共享的套接字的所有連接,不管這個套接字的引用計數是否為零,那些試圖讀得進程將會接收到EOF標識,那些試圖寫的進程將會檢測到SIGPIPE信號,同時可利用shutdown的第二個參數選擇斷連的方式。

⑨ 網路編程的select()函數工作原理

1. select系統調用
select系統調用是用來讓我們的程序監視多個文件描述符的狀態變化的。程序會停在select這里等待,直到被監視的文件描述符有某一個或多個發生了狀態改變。
select()的機制中提供一fd_set的數據結構,實際上是一long類型的數組,每一個數組元素都能與一打開的文件句柄建立聯系,建立聯系的工作由程序員完成,當調用select()時,由內核根據IO狀態修改fd_set的內容,由此來通知執行了select()的進程哪些Socket或文件可讀可寫。
select函數原型:
#include <sys/select.h> #include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);
ndfs:select監視的文件句柄數,視進程中打開的文件數而定,一般設為要監視各文件中的最大文件描述符值加1。
readfds:這個文件描述符集合監視文件集中的任何文件是否有數據可讀,當select函數返回的時候,readfds將清除其中不可讀的文件描述符,只留下可讀的文件描述符。
writefds:這個文件描述符集合監視文件集中的任何文件是否有數據可寫,當select函數返回的時候,writefds將清除其中不可寫的文件描述符,只留下可寫的文件描述符。
exceptfds:這個文件集將監視文件集中的任何文件是否發生錯誤,其實,它可用於其他的用途,例如,監視帶外數據OOB,帶外數據使用MSG_OOB標志發送到套接字上。當select函數返回的時候,exceptfds將清除其中的其他文件描述符,只留下標記有OOB數據的文件描述符。
timeout:本次select()的超時結束時間。這個參數至關重要,它可以使select處於三種狀態:
(1)若將NULL以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視文件描述符集合中某個文件描述符發生變化為止;
(2)若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函數,不管文件描述符是否有變化,都立刻返回繼續執行,文件無變化返回0,有變化返回一個正值;
(3)timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。
函數的返回值:
正值:表示監視的文件集中有文件描述符符合要求
零值:表示select監視超時
負值:表示發生了錯誤,錯誤值由errno指定。
宏操作:
FD_ZERO(fd_set *set): 用來清除描述片語set的全部位
FD_SET(int fd,fd_set*set): 用來設置描述片語set中相關fd的位
FD_ISSET(int fd,fd_set *set): 用來測試描述片語set中相關fd 的位是否為真
FD_CLR(inr fd,fd_set* set): 用來清除描述片語set中相關fd 的位注意事項:
(1)對於可寫性的檢查,最好放在需要寫數據的時候進行檢查。如果和可讀性放在同一個地方進行檢查,那麼select很可能每次都會因為可寫性檢查成功而返回。
(2)select()調用會清空傳遞給它的集合參數中的內容,也就是會清空readfds、writefd、exceptfds這三個指針參數所指定的描述符集合。因此,在每次調用select()之前,必須重新初始化並把需要監視的描述符填寫到相應的描述符集合中。select()調用也會清空timeout指針所指向的struct timeval結構,所以在每次調用select()之前也要重新填充timeout指針所指向的struct timeval結構。

⑩ 計算機網路編程,關於ioctl函數,求大神指教。

下面的清單介紹了一些最重要的結構,使用 ioctl 套接字命令時常常用到這些結構。
清單 1. struct ifreq (/usr/include/net/if.h)

/* Interface request structure used for socket
* ioctl's. All interface ioctl's must have parameter
* definitions which begin with ifr_name. The
* remainder may be interface specific.
*/
struct ifreq {
#ifndef IFNAMSIZ
#define IFNAMSIZ 16
#endif
char ifr_name[IFNAMSIZ];
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
__ulong32_t ifru_flags;
int ifru_metric;
caddr_t ifru_data;
u_short ifru_site6;
__ulong32_t ifru_mtu;
int ifru_baudrate;
} ifr_ifru;
Following macros are provided for convenience
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags ifr_ifru.ifru_flags /* flags */
#define ifr_metric ifr_ifru.ifru_metric /* metric */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
#define ifr_site6 ifr_ifru.ifru_site6 /* IPv6 site index */
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu of interface */
#define ifr_isno ifr_ifru.ifru_data /* pointer to if_netopts */
#define ifr_baudrate ifr_ifru.ifru_baudrate /* baudrate of interface */
};

清單 2. struct ifconf (/usr/include/net/if.h)

/*
* Structure used in SIOCGIFCONF request.
* Used to retrieve interface configuration
* for machine (useful for programs which
* must know all networks accessible).
*/
struct ifconf {
int ifc_len; /* size of associated buffer */
union {
caddr_t ifcu_buf;
struct ifreq *ifcu_req;
} ifc_ifcu;
Following macros are provided for convenience
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
};
可以去網路上搜下編程回憶錄之Unity3D,他們有公開課,你們看看就知道,我感覺非常的好。

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:512
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:14
linux485 發布:2025-07-05 14:38:28 瀏覽:296
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:747
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:421
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:671
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:229
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:672
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:273
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:823