锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍏蜂綋鐨勫疄鐜頒篃灝辨槸鎸夎繖涓祦紼嬪浘鏉ュ仛鐨勶紝榪欓噷閲嶇偣鏄湇鍔$鐨勫疄鐜般?/p>
鍦ㄦ帴鏀跺鎴風鍙戞潵鏁版嵁鐨勫湴鏂硅鍋氭垚姝誨驚鐜紝濡傛灉闇瑕佹柇寮榪炴帴錛屽垯鐢卞鎴鋒柇鍙戦佺壒瀹氱殑娑堟伅鐒跺悗榪涜澶勭悊銆傝繕鏈夐渶瑕佹敞鎰忕殑鏄笂闈㈢殑HostIp鏄湰鏈虹殑IP鍦板潃錛孭ORT鏄鎺ュ瓧闇瑕佺粦瀹氱殑绔彛銆?/p>
]]>
]]>
闈為樆濉炴ā寮忥細鎵цI/O鎿嶄綔鏃訛紝Winsock鍑芥暟浼氳繑鍥炲茍浜ゅ嚭鎺у埗鏉冦傝繖縐嶆ā寮忎嬌鐢?/span> 璧鋒潵姣旇緝澶嶆潅錛屽洜涓哄嚱鏁板湪娌℃湁榪愯瀹屾垚灝辮繘琛岃繑鍥烇紝浼氫笉鏂湴榪斿洖 WSAEWOULDBLOCK閿欒銆備絾鍔熻兘寮哄ぇ銆?/span>
]]>
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
ofstream logfile("LogFile.txt");
//Initialize winsock
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData);
if(iResult != NO_ERROR)
{
logfile<<"Error at WSAStartup() ";
logfile.close();
return 1;
}
else
logfile<<"Initialize WSAStartup OK!";
// Create a socket.
SOCKET serverSocket;
serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET)
{
logfile<<"Error at socket():"<<WSAGetLastError()<<endl;;
logfile.close();
WSACleanup();
return 1;
}
else
{
logfile<<"Create socket OK!";
}
// Bind the socket.
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr(HostIp.c_str());
service.sin_port=htons(PORT);
if (bind(serverSocket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
logfile<<"bind() failed"<<GetLastError()<<endl;
closesocket(serverSocket);
logfile.close();
return 1;
}
else
{
logfile<<"Binding OK!"<<endl;
}
// Listen on the socket.
if(listen(serverSocket,1)==SOCKET_ERROR)
{
logfile<<"Error listening on socket"<<GetLastError()<<endl;
logfile.close();
}
else
{
logfile<<"Listening..."<<endl;
}
// Accept connections.
SOCKET clientSocket;
sockaddr_in clientAddr;
int clientAddrLen=sizeof(clientAddr);
while(true)
{
clientSocket = SOCKET_ERROR;
while(clientSocket==SOCKET_ERROR)
{
clientSocket=accept(serverSocket,(struct sockaddr*)&clientAddr,&clientAddrLen);
}
ReceiveData(clientSocket);
}
closesocket(serverSocket);
closesocket(clientSocket);
return 0;
}
//Receive the data
void ReceiveData(SOCKET& clientSocket)
{
int bytesSent;
int bytesRecv=SOCKET_ERROR;
string sendbuf="";
char recvbuf[32]="";
while(bytesRecv ==SOCKET_ERROR)
{
bytesRecv=recv(clientSocket,recvbuf,32,0);
sendbuf="Received: "+(string)recvbuf;
bytesSent=send(clientSocket,sendbuf.c_str(),(unsigned int)(sendbuf.size()),0);
bytesRecv=SOCKET_ERROR;
memset(recvbuf,'\0',32);
涓鑸柟娉曟槸:寤虹珛涓や釜榪炴帴鍙ユ焺闃熷垪,絀洪棽鐨勭瓑寰呬嬌鐢ㄧ殑闃熷垪鍜屾鍦ㄤ嬌鐢ㄧ殑闃熷垪.
褰撹鏌ヨ鏃跺厛浠庣┖闂查槦鍒椾腑鑾峰彇涓涓彞鏌?鎻掑叆鍒版鍦ㄤ嬌鐢ㄧ殑闃熷垪,鍐嶇敤榪欎釜鍙ユ焺鍋氭暟鎹簱鎿嶄綔,瀹屾瘯鍚庝竴瀹氳浠庝嬌鐢ㄩ槦鍒椾腑鍒犻櫎,鍐嶆彃鍏ュ埌絀洪棽闃熷垪.
浠g爜濡備笅錛?br>MySQLMan.h
// MySQLMan.h: interface for the CMySQLMan class.
//
//////////////////////////////////////////////////////////////////////
#include <mysql.h>
#pragma comment(lib,"libmySQL.lib")
#include <list>
typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST;
typedef std::list<MYSQL *>::iterator ITER_CONNECTION_HANDLE_LIST;
#define CONNECTION_NUM 10 //鍚屾椂鎵撳紑鐨勮繛鎺ユ暟
class CMySQLMan
{
public:
CMySQLMan();
CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port=3306);
virtual ~CMySQLMan();
public:
bool ConnectDB(); //榪炴帴鏁版嵁搴?br> MYSQL_RES* SelectRecord(const char *szSql); //閫夋嫨璁板綍錛岃繑鍥炵粨鏋滈泦
bool SelectDB(const char *szDB); //閫夋嫨鏁版嵁搴?br> bool UpdateRecord(const char *szSql); //鏇存柊璁板綍
bool InsertRecord(const char *szSql); //鎻掑叆璁板綍
bool DelRecord(const char *szSql); //鍒犻櫎璁板綍
BOOL IsEnd(MYSQL_RES *myquery); //鏄惁鏈鍚?br> void SeekData(MYSQL_RES *myquery, int offset); //鏌ユ壘鎸囧畾鏁版嵁
void FreeRecord(MYSQL_RES *myquery); //閲婃斁緇撴灉闆?br> unsigned int GetFieldNum(MYSQL_RES *myquery); //寰楀埌瀛楁鏁?br> MYSQL_ROW GetRecord(MYSQL_RES *myquery); //寰楀埌緇撴灉錛堜竴涓褰曪級
my_ulonglong GetRowNum(MYSQL_RES *myquery); //寰楀埌璁板綍鏁?br> char* OutErrors(MYSQL* pMySql); //杈撳嚭閿欒淇℃伅
char* GetState(); //鏈嶅姟鍣ㄧ姸鎬?br> char* GetServerInfo(); //鏈嶅姟鍣ㄤ俊鎭?br> int GetProtocolInfo(); //鍗忚淇℃伅
char* GetHostInfo(); //涓繪満淇℃伅
char* GetClientInfo(); //瀹㈡埛鏈轟俊鎭?br> char* GetFieldName(MYSQL_RES *myquery, int FieldNum); //瀛楁鍚?/p>
bool LockTable(const char *TableName, const char *Priority); //瀵圭壒瀹氳〃鍔犻攣
bool UnlockTable(); //瑙i攣
bool SetCharset();
//int CreateDB(char *db); //鍒涘緩鏁版嵁搴擄紝榪斿洖閿欒淇℃伅
//int DropDB(char *db); //鍒犻櫎鏁版嵁搴?榪斿洖閿欒淇℃伅
MYSQL* GetIdleMySql(); //鎻愬彇涓涓┖闂插彞鏌勪緵浣跨敤
void SetIdleMysql(MYSQL* pMySql); //浠庝嬌鐢ㄩ槦鍒椾腑閲婃斁涓涓嬌鐢ㄥ畬姣曠殑鍙ユ焺錛屾彃鍏ュ埌絀洪棽闃熷垪
public:
//MYSQL m_mysql; //鏁版嵁搴撹繛鎺ュ彞鏌?br> MYSQL_ROW m_row; //璁板綍闆?鍗曡)
MYSQL_FIELD *m_field; //瀛楁淇℃伅錛堢粨鏋勪綋錛?/p>
//鍒涘緩涓や釜闃熷垪
CONNECTION_HANDLE_LIST m_lsBusyList; //姝e湪浣跨敤鐨勮繛鎺ュ彞鏌?br> CONNECTION_HANDLE_LIST m_lsIdleList; //鏈嬌鐢ㄧ殑榪炴帴鍙ユ焺
CRITICAL_SECTION m_csList;
public:
char m_host[20]; //涓繪満
char m_user[20]; //鐢ㄦ埛鍚?br> char m_password[20]; //瀵嗙爜
char m_db[20]; //鏁版嵁搴撳悕
unsigned int m_port; //绔彛
};
MySQLMan.cpp
// MySQLMan.cpp: implementation of the MySQLMan class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MySQLMan.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMySQLMan::CMySQLMan()
{
}
CMySQLMan::CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port/* =3306 */)
{
strcpy(m_host, host);
strcpy(m_user, user);
strcpy(m_password, password);
strcpy(m_db, db);
m_port = port;
InitializeCriticalSection(&m_csList);
}
CMySQLMan::~CMySQLMan()
{
for (ITER_CONNECTION_HANDLE_LIST iter=m_lsBusyList.begin(); iter != m_lsBusyList.end(); iter++)
{
mysql_close((*iter));
}
for (ITER_CONNECTION_HANDLE_LIST iter=m_lsIdleList.begin(); iter != m_lsIdleList.end(); iter++)
{
mysql_close((*iter));
}
DeleteCriticalSection(&m_csList);
}
bool CMySQLMan::ConnectDB()
{
//鍚屾椂鎵撳紑CONNECTION_NUM涓繛鎺?br> try
{
for (int i=0; i<CONNECTION_NUM; ++i)
{
MYSQL *pMySql = mysql_init((MYSQL*)NULL);
if (pMySql != NULL)
{
if (!mysql_real_connect(pMySql,m_host,m_user,m_password,m_db,m_port,NULL,0))
{
OutErrors(pMySql);
return false;
}
m_lsIdleList.push_back(pMySql);
}
}
}
catch (...)
{
return false;
}
return true;
}
MYSQL* CMySQLMan::GetIdleMySql()
{
MYSQL* pMySql = NULL;
EnterCriticalSection(&m_csList);
if (m_lsIdleList.size() > 0)
{
pMySql = m_lsIdleList.front();
m_lsIdleList.pop_front();
m_lsBusyList.push_back(pMySql);
}
else
{
pMySql = NULL;
}
LeaveCriticalSection(&m_csList);
return pMySql;
}
void CMySQLMan::SetIdleMysql(MYSQL* pMySql)
{
EnterCriticalSection(&m_csList);
m_lsBusyList.remove(pMySql);
m_lsIdleList.push_back(pMySql);
LeaveCriticalSection(&m_csList);
}
MYSQL_RES* CMySQLMan::SelectRecord(const char *szSql)
{
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
if(mysql_query(pMySql,szSql))
return NULL;
MYSQL_RES *myquery = NULL;
myquery = mysql_store_result(pMySql);
SetIdleMysql(pMySql);
return myquery;
}
bool CMySQLMan::InsertRecord(const char *szSql)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,szSql))
{
bRet = true;
}
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::UpdateRecord(const char *szSql)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,szSql))
{
bRet = true;
}
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::DelRecord(const char *szSql)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,szSql))
{
bRet = true;
}
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::SelectDB(const char *szDB)
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if (mysql_select_db(pMySql,szDB))
bRet = false;
else
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
my_ulonglong CMySQLMan::GetRowNum(MYSQL_RES *myquery)
{
return mysql_num_rows(myquery);
}
MYSQL_ROW CMySQLMan::GetRecord(MYSQL_RES *myquery)
{
m_row = mysql_fetch_row(myquery);
return m_row;
}
unsigned int CMySQLMan::GetFieldNum(MYSQL_RES *myquery)
{
return mysql_num_fields(myquery);
}
void CMySQLMan::FreeRecord(MYSQL_RES *myquery)
{
mysql_free_result(myquery);
}
//int CMySQLMan::CreateDB(char *db)
//{
// return mysql_create_db(&m_mysql,db);
//}
void CMySQLMan::SeekData(MYSQL_RES *myquery, int offset)
{
mysql_data_seek(myquery,offset);
}
char * CMySQLMan::OutErrors(MYSQL *pMySql)
{
return const_cast<char *>(mysql_error(pMySql));
}
BOOL CMySQLMan::IsEnd(MYSQL_RES *myquery)
{
return mysql_eof(myquery);
}
char* CMySQLMan::GetFieldName(MYSQL_RES *myquery, int FieldNum)
{
m_field = mysql_fetch_field_direct(myquery, FieldNum);
return m_field->name;
}
char * CMySQLMan::GetClientInfo()
{
return const_cast<char *>(mysql_get_client_info());
}
char* CMySQLMan::GetHostInfo()
{
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
return const_cast<char *>(mysql_get_host_info(pMySql));
}
int CMySQLMan::GetProtocolInfo()
{
int iRet = 0;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
iRet = mysql_get_proto_info(pMySql);
SetIdleMysql(pMySql);
return iRet;
}
char* CMySQLMan::GetServerInfo()
{
static char szRet[1024];
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
_tcscpy(szRet, const_cast<char *>(mysql_get_server_info(pMySql)));
SetIdleMysql(pMySql);
return szRet;
}
char* CMySQLMan::GetState()
{
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return NULL;
}
static char szRet[1024];
_tcscpy(szRet,const_cast<char *>(mysql_stat(pMySql)));
SetIdleMysql(pMySql);
return szRet;
}
bool CMySQLMan::SetCharset()
{
bool bRet = false;
char szSql[50];
strcpy(szSql, "set names gb2312");
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if (mysql_query(pMySql, szSql))
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
//LOCK TABLES tbl1 READ, tbl2 WRITE
bool CMySQLMan::LockTable(const char *TableName, const char *Priority)
{
bool bRet = false;
char szSql[50];
sprintf(szSql, "LOCK TABLES %s %s", TableName, Priority);
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if (mysql_query(pMySql, szSql))
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
bool CMySQLMan::UnlockTable()
{
bool bRet = false;
MYSQL *pMySql = GetIdleMySql();
if (pMySql == NULL)
{
return false;
}
if(mysql_query(pMySql,"UNLOCK TABLES"))
bRet = true;
SetIdleMysql(pMySql);
return bRet;
}
涓嬮潰鏄竴涓楠屾湰鏈哄瓧鑺傚簭鐨勭畝渚挎柟娉曪細
//鍒ゆ柇鏈満鐨勫瓧鑺傚簭
//榪斿洖true琛ㄤ負灝忔搴忋傝繑鍥瀎alse琛ㄧず涓哄ぇ孌靛簭
bool am_little_endian ()
{
unsigned short i=1;
return (int)*((char *)(&i)) ? true : false;
}
int main()
{
if(am_little_endian())
{
printf("鏈満瀛楄妭搴忎負灝忔搴?\n");
}
else
{
printf("鏈満瀛楄妭搴忎負澶ф搴?\n");
}
return 0;
}
銆銆Socket鎺ュ彛鏄?span>TCP/IP緗戠粶鐨?span>API錛?span>Socket鎺ュ彛瀹氫箟浜嗚澶氬嚱鏁版垨渚嬬▼錛岀▼搴忓憳鍙互鐢ㄥ畠浠潵寮鍙?span>TCP/IP緗戠粶涓婄殑搴旂敤紼嬪簭銆傝瀛?span>Internet涓婄殑TCP/IP緗戠粶緙栫▼錛屽繀欏葷悊瑙?span>Socket鎺ュ彛銆?span>
銆銆Socket鎺ュ彛璁捐鑰呮渶鍏堟槸灝嗘帴鍙f斁鍦?span>Unix鎿嶄綔緋葷粺閲岄潰鐨勩傚鏋滀簡瑙?span>Unix緋葷粺鐨勮緭鍏ュ拰杈撳嚭鐨勮瘽錛屽氨寰堝鏄撲簡瑙?span>Socket浜嗐傜綉緇滅殑Socket鏁版嵁浼犺緭鏄竴縐嶇壒孌婄殑I/O錛?span>Socket涔熸槸涓縐嶆枃浠舵弿榪扮銆?span>Socket涔熷叿鏈変竴涓被浼間簬鎵撳紑鏂囦歡鐨勫嚱鏁拌皟鐢?span>Socket()錛岃鍑芥暟榪斿洖涓涓暣鍨嬬殑Socket鎻忚堪絎︼紝闅忓悗鐨勮繛鎺ュ緩绔嬨佹暟鎹紶杈撶瓑鎿嶄綔閮芥槸閫氳繃璇?span>Socket瀹炵幇鐨勩傚父鐢ㄧ殑Socket綾誨瀷鏈変袱縐嶏細嫻佸紡Socket錛?span>SOCK_STREAM錛夊拰鏁版嵁鎶ュ紡Socket錛?span>SOCK_DGRAM錛夈傛祦寮忔槸涓縐嶉潰鍚戣繛鎺ョ殑Socket錛岄拡瀵逛簬闈㈠悜榪炴帴鐨?span>TCP鏈嶅姟搴旂敤錛涙暟鎹姤寮?span>Socket鏄竴縐嶆棤榪炴帴鐨?span>Socket錛屽搴斾簬鏃犺繛鎺ョ殑UDP鏈嶅姟搴旂敤銆?span>
銆銆Socket寤虹珛
銆銆涓轟簡寤虹珛Socket錛岀▼搴忓彲浠ヨ皟鐢?span>socket鍑芥暟錛岃鍑芥暟榪斿洖涓涓被浼間簬鏂囦歡鎻忚堪絎︾殑鍙ユ焺銆?span>socket鍑芥暟鍘熷瀷涓猴細
銆銆int socket(int domain, int type, int protocol);
銆銆domain鎸囨槑鎵浣跨敤鐨?span>鍗忚鏃忥紝閫氬父涓?span>AF_INET錛岃〃紺?span>浜掕仈緗?/span>鍗忚鏃忥紙TCP/IP鍗忚鏃忥級錛?span>type鍙傛暟鎸囧畾socket鐨勭被鍨嬶細SOCK_STREAM 鎴?span>SOCK_DGRAM錛?span>Socket鎺ュ彛榪樺畾涔変簡鍘熷Socket錛?span>SOCK_RAW錛夛紝鍏佽紼嬪簭浣跨敤浣庡眰鍗忚錛?span>protocol閫氬父璧嬪?span>"0"錛堣〃紺烘牴鎹?span>type鏉ヨ嚜鍔ㄩ夋嫨鍗忚錛夈?span>socket()璋冪敤榪斿洖涓涓暣鍨?span>socket鎻忚堪絎︼紝浣犲彲浠ュ湪鍚庨潰鐨勮皟鐢ㄤ嬌鐢ㄥ畠銆?/span>
銆銆Socket鎻忚堪絎︽槸涓涓寚鍚戝唴閮ㄦ暟鎹粨鏋勭殑鎸囬拡錛屽畠鎸囧悜鎻忚堪絎﹁〃鍏ュ彛銆傝皟鐢?span>Socket鍑芥暟鏃訛紝socket鎵ц浣撳皢寤虹珛涓涓?span>Socket錛屽疄闄呬笂"寤虹珛涓涓?span>Socket"鎰忓懗鐫涓轟竴涓?span>Socket鏁版嵁緇撴瀯鍒嗛厤瀛樺偍絀洪棿銆?span>Socket鎵ц浣撲負浣犵鐞嗘弿榪扮琛ㄣ?/span>
銆銆涓や釜緗戠粶紼嬪簭涔嬮棿鐨勪竴涓綉緇滆繛鎺ュ寘鎷簲縐嶄俊鎭細閫氫俊鍗忚銆佹湰鍦板崗璁湴鍧銆佹湰鍦頒富鏈虹鍙c佽繙绔富鏈哄湴鍧鍜岃繙绔崗璁鍙c?span>Socket鏁版嵁緇撴瀯涓寘鍚繖浜旂淇℃伅銆?span>
銆銆Socket閰嶇疆
銆銆閫氳繃socket鍑芥暟璋冪敤榪斿洖涓涓?span>socket鎻忚堪絎﹀悗錛屽湪浣跨敤socket榪涜緗戠粶浼犺緭浠ュ墠錛屽繀欏婚厤緗socket銆傞潰鍚戣繛鎺ョ殑socket瀹㈡埛绔氳繃璋冪敤connect鍑芥暟鍦?span>socket鏁版嵁緇撴瀯涓繚瀛樻湰鍦板拰榪滅淇℃伅銆傛棤榪炴帴socket鐨勫鎴風鍜屾湇鍔$浠ュ強闈㈠悜榪炴帴socket鐨勬湇鍔$閫氳繃璋冪敤bind鍑芥暟鏉ラ厤緗湰鍦頒俊鎭?span>
bind鍑芥暟灝?span>socket涓庢湰鏈轟笂鐨勪竴涓鍙g浉鍏寵仈錛岄殢鍚庝綘灝卞彲浠ュ湪璇ョ鍙g洃鍚湇鍔¤姹傘?span>bind鍑芥暟鍘熷瀷涓猴細
銆銆
|
int bind(int sockfd,struct sockaddr *my_addr, int addrlen); my_addr鏄竴涓寚鍚戝寘鍚湁鏈満IP鍦板潃鍙婄鍙e彿絳変俊鎭殑sockaddr綾誨瀷鐨勬寚閽堬紱 addrlen甯歌璁劇疆涓?span>sizeof(struct sockaddr)銆?span> |
銆銆榪欎釜緇撴瀯鏇存柟渚夸嬌鐢ㄣ?span>sin_zero鐢ㄦ潵灝?span>sockaddr_in緇撴瀯濉厖鍒頒笌struct sockaddr鍚屾牱鐨勯暱搴︼紝鍙互鐢?span>bzero()鎴?span>memset()鍑芥暟灝嗗叾緗負闆躲傛寚鍚?span>sockaddr_in 鐨勬寚閽堝拰鎸囧悜sockaddr鐨勬寚閽堝彲浠ョ浉浜掕漿鎹紝榪欐剰鍛崇潃濡傛灉涓涓嚱鏁版墍闇鍙傛暟綾誨瀷鏄?span>sockaddr鏃訛紝浣犲彲浠ュ湪鍑芥暟璋冪敤鐨勬椂鍊欏皢涓涓寚鍚?span>sockaddr_in鐨勬寚閽堣漿鎹負鎸囧悜sockaddr鐨勬寚閽堬紱鎴栬呯浉鍙嶃?span>
銆銆浣跨敤bind鍑芥暟鏃訛紝鍙互鐢ㄤ笅闈㈢殑璧嬪煎疄鐜拌嚜鍔ㄨ幏寰楁湰鏈?span>IP鍦板潃鍜岄殢鏈鴻幏鍙栦竴涓病鏈夎鍗犵敤鐨勭鍙e彿錛?span>
銆銆my_addr.sin_port = 0; /* 緋葷粺闅忔満閫夋嫨涓涓湭琚嬌鐢ㄧ殑绔彛鍙?span> */
銆銆my_addr.sin_addr.s_addr = INADDR_ANY; /* 濉叆鏈満IP鍦板潃 */
閫氳繃灝?span>my_addr.sin_port緗負0錛屽嚱鏁頒細鑷姩涓轟綘閫夋嫨涓涓湭鍗犵敤鐨勭鍙f潵浣跨敤銆傚悓鏍鳳紝閫氳繃灝?span>my_addr.sin_addr.s_addr緗負INADDR_ANY錛岀郴緇熶細鑷姩濉叆鏈満IP鍦板潃銆?/span>
銆銆娉ㄦ剰鍦ㄤ嬌鐢?span>bind鍑芥暟鏄渶瑕佸皢sin_port鍜?span>sin_addr杞崲鎴愪負緗戠粶瀛楄妭浼樺厛欏哄簭錛涜?span>sin_family鍒欎笉闇瑕佽漿鎹€?/span>
銆銆璁$畻鏈烘暟鎹?span>瀛樺偍鏈変袱縐嶅瓧鑺備紭鍏堥『搴忥細楂樹綅瀛楄妭浼樺厛鍜屼綆浣嶅瓧鑺備紭鍏堛?span>Internet涓婃暟鎹互楂樹綅瀛楄妭浼樺厛欏哄簭鍦ㄧ綉緇滀笂浼犺緭錛屾墍浠ュ浜庡湪鍐呴儴鏄互浣庝綅瀛楄妭浼樺厛鏂瑰紡瀛樺偍鏁版嵁鐨勬満鍣紝鍦?span>Internet涓婁紶杈撴暟鎹椂灝遍渶瑕佽繘琛岃漿鎹紝鍚﹀垯灝變細鍑虹幇鏁版嵁涓嶄竴鑷淬?/span>
銆銆涓嬮潰鏄嚑涓瓧鑺傞『搴忚漿鎹㈠嚱鏁幫細
|
·htonl()錛氭妸32浣嶅間粠涓繪満瀛楄妭搴忚漿鎹㈡垚緗戠粶瀛楄妭搴?span> |
銆銆bind()鍑芥暟鍦ㄦ垚鍔熻璋冪敤鏃惰繑鍥?span>0錛涘嚭鐜伴敊璇椂榪斿洖"-1"騫跺皢errno緗負鐩稿簲鐨勯敊璇彿銆傞渶瑕佹敞鎰忕殑鏄紝鍦ㄨ皟鐢?span>bind鍑芥暟鏃朵竴鑸笉瑕佸皢绔彛鍙風疆涓哄皬浜?span>1024鐨勫鹼紝鍥犱負1鍒?span>1024鏄繚鐣欑鍙e彿錛屼綘鍙互閫夋嫨澶т簬1024涓殑浠諱綍涓涓病鏈夎鍗犵敤鐨勭鍙e彿銆?/span>
榪炴帴寤虹珛
闈㈠悜榪炴帴鐨勫鎴風▼搴忎嬌鐢?span>connect鍑芥暟鏉ラ厤緗?span>socket騫朵笌榪滅鏈嶅姟鍣?/span>寤虹珛涓涓?span>TCP榪炴帴錛屽叾鍑芥暟鍘熷瀷涓猴細
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd鏄?span>socket鍑芥暟榪斿洖鐨?span>socket鎻忚堪絎︼紱serv_addr鏄寘鍚繙绔富鏈?span>IP鍦板潃鍜岀鍙g殑鎸囬拡錛?span>addrlen鏄繙绔湴鍧緇撴瀯鐨勯暱搴?span>(sizeof(struct sockaddr))銆?span>connect鍑芥暟鍦ㄥ嚭鐜伴敊璇椂榪斿洖-1錛屽茍涓旇緗?span>errno涓虹浉搴旂殑閿欒鐮併傝繘琛屽鎴風紼嬪簭璁捐鏃犻』璋冪敤bind()錛屽洜涓鴻繖縐嶆儏鍐典笅鍙渶鐭ラ亾鐩殑鏈哄櫒鐨?span>IP鍦板潃錛岃屽鎴烽氳繃鍝釜绔彛涓?span>鏈嶅姟鍣?/span>寤虹珛榪炴帴騫朵笉闇瑕佸叧蹇冿紝socket鎵ц浣撲負浣犵殑紼嬪簭鑷姩閫夋嫨涓涓湭琚崰鐢ㄧ殑绔彛錛屽茍閫氱煡浣犵殑紼嬪簭鏁版嵁浠涔堟椂鍊欏埌鎵撴柇鍙c?/span>
銆銆connect鍑芥暟鍚姩鍜岃繙绔富鏈虹殑鐩存帴榪炴帴銆傚彧鏈夐潰鍚戣繛鎺ョ殑瀹㈡埛紼嬪簭浣跨敤socket鏃舵墠闇瑕佸皢姝?span>socket涓庤繙绔富鏈虹浉榪炪傛棤榪炴帴鍗忚浠庝笉寤虹珛鐩存帴榪炴帴銆傞潰鍚戣繛鎺ョ殑鏈嶅姟鍣ㄤ篃浠庝笉鍚姩涓涓繛鎺ワ紝瀹冨彧鏄鍔ㄧ殑鍦ㄥ崗璁鍙g洃鍚鎴風殑璇鋒眰銆?span>
銆銆listen鍑芥暟浣?span>socket澶勪簬琚姩鐨勭洃鍚ā寮忥紝騫朵負璇?span>socket寤虹珛涓涓緭鍏ユ暟鎹槦鍒楋紝灝嗗埌杈劇殑鏈嶅姟璇鋒眰淇濆瓨鍦ㄦ闃熷垪涓紝鐩村埌紼嬪簭澶勭悊瀹冧滑銆?/span>
銆銆int listen(int sockfd錛?span> int backlog);
銆銆sockfd鏄?span>Socket緋葷粺璋冪敤榪斿洖鐨?span>socket 鎻忚堪絎︼紱backlog鎸囧畾鍦ㄨ姹傞槦鍒椾腑鍏佽鐨勬渶澶ц姹傛暟錛岃繘鍏ョ殑榪炴帴璇鋒眰灝嗗湪闃熷垪涓瓑寰?span>accept()瀹冧滑錛堝弬鑰冧笅鏂囷級銆?span>backlog瀵歸槦鍒椾腑絳夊緟鏈嶅姟鐨勮姹傜殑鏁扮洰榪涜浜嗛檺鍒訛紝澶у鏁扮郴緇熺己鐪佸間負20銆傚鏋滀竴涓湇鍔¤姹傚埌鏉ユ椂錛岃緭鍏ラ槦鍒楀凡婊★紝璇?span>socket灝嗘嫆緇濊繛鎺ヨ姹傦紝瀹㈡埛灝嗘敹鍒頒竴涓嚭閿欎俊鎭?/span>
銆銆褰撳嚭鐜伴敊璇椂listen鍑芥暟榪斿洖-1錛屽茍緗浉搴旂殑errno閿欒鐮併?/span>
銆銆accept()鍑芥暟璁╂湇鍔″櫒鎺ユ敹瀹㈡埛鐨勮繛鎺ヨ姹傘傚湪寤虹珛濂借緭鍏ラ槦鍒楀悗錛屾湇鍔″櫒灝辮皟鐢?span>accept鍑芥暟錛岀劧鍚庣潯鐪犲茍絳夊緟瀹㈡埛鐨勮繛鎺ヨ姹傘?/span>
銆銆int accept(int sockfd, void *addr, int *addrlen);
銆銆sockfd鏄鐩戝惉鐨?span>socket鎻忚堪絎︼紝addr閫氬父鏄竴涓寚鍚?span>sockaddr_in鍙橀噺鐨勬寚閽堬紝璇ュ彉閲忕敤鏉ュ瓨鏀炬彁鍑鴻繛鎺ヨ姹傛湇鍔$殑涓繪満鐨勪俊鎭紙鏌愬彴涓繪満浠庢煇涓鍙e彂鍑鴻璇鋒眰錛夛紱addrlen閫氬父涓轟竴涓寚鍚戝間負sizeof(struct sockaddr_in)鐨勬暣鍨嬫寚閽堝彉閲忋傚嚭鐜伴敊璇椂accept鍑芥暟榪斿洖-1騫剁疆鐩稿簲鐨?span>errno鍊箋?/span>
銆銆棣栧厛錛屽綋accept鍑芥暟鐩戣鐨?span>socket鏀跺埌榪炴帴璇鋒眰鏃訛紝socket鎵ц浣撳皢寤虹珛涓涓柊鐨?span>socket錛屾墽琛屼綋灝嗚繖涓柊socket鍜岃姹傝繛鎺ヨ繘紼嬬殑鍦板潃鑱旂郴璧鋒潵錛屾敹鍒版湇鍔¤姹傜殑鍒濆socket浠嶅彲浠ョ戶緇湪浠ュ墠鐨?span> socket涓婄洃鍚紝鍚屾椂鍙互鍦ㄦ柊鐨?span>socket鎻忚堪絎︿笂榪涜鏁版嵁浼犺緭鎿嶄綔銆?span>
銆銆鏁版嵁浼犺緭
銆銆send()鍜?span>recv()榪欎袱涓嚱鏁扮敤浜庨潰鍚戣繛鎺ョ殑socket涓婅繘琛屾暟鎹紶杈撱?span>
銆銆send()鍑芥暟鍘熷瀷涓猴細
銆銆int send(int sockfd, const void *msg, int len, int flags);
sockfd鏄綘鎯崇敤鏉ヤ紶杈撴暟鎹殑socket鎻忚堪絎︼紱msg鏄竴涓寚鍚戣鍙戦佹暟鎹殑鎸囬拡錛?span>len鏄互瀛楄妭涓哄崟浣嶇殑鏁版嵁鐨勯暱搴︼紱flags涓鑸儏鍐典笅緗負0錛堝叧浜庤鍙傛暟鐨勭敤娉曞彲鍙傜収man鎵嬪唽錛夈?span>
銆銆send()鍑芥暟榪斿洖瀹為檯涓婂彂閫佸嚭鐨勫瓧鑺傛暟錛屽彲鑳戒細灝戜簬浣犲笇鏈涘彂閫佺殑鏁版嵁銆傚湪紼嬪簭涓簲璇ュ皢send()鐨勮繑鍥炲間笌嬈插彂閫佺殑瀛楄妭鏁拌繘琛屾瘮杈冦傚綋send()榪斿洖鍊間笌len涓嶅尮閰嶆椂錛屽簲璇ュ榪欑鎯呭喌榪涜澶勭悊銆?span>
char *msg = "Hello!";
int len, bytes_sent;
……
len = strlen(msg);
bytes_sent = send(sockfd, msg,len,0);
……
銆銆recv()鍑芥暟鍘熷瀷涓猴細
銆銆int recv(int sockfd,void *buf,int len,unsigned int flags);
銆銆sockfd鏄帴鍙楁暟鎹殑socket鎻忚堪絎︼紱buf 鏄瓨鏀炬帴鏀舵暟鎹殑緙撳啿鍖猴紱len鏄紦鍐茬殑闀垮害銆?span>Flags涔熻緗負0銆?span>recv()榪斿洖瀹為檯涓婃帴鏀剁殑瀛楄妭鏁幫紝褰撳嚭鐜伴敊璇椂錛岃繑鍥?span>-1騫剁疆鐩稿簲鐨?span>errno鍊箋?span>
銆銆sendto()鍜?span>recvfrom()鐢ㄤ簬鍦ㄦ棤榪炴帴鐨勬暟鎹姤socket鏂瑰紡涓嬭繘琛屾暟鎹紶杈撱傜敱浜庢湰鍦?span>socket騫舵病鏈変笌榪滅鏈哄櫒寤虹珛榪炴帴錛屾墍浠ュ湪鍙戦佹暟鎹椂搴旀寚鏄庣洰鐨勫湴鍧銆?span>
銆銆sendto()鍑芥暟鍘熷瀷涓猴細
銆銆int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);
銆銆璇ュ嚱鏁版瘮send()鍑芥暟澶氫簡涓や釜鍙傛暟錛?span>to琛ㄧず鐩湴鏈虹殑IP鍦板潃鍜岀鍙e彿淇℃伅錛岃?span>tolen甯稿父琚祴鍊間負sizeof (struct sockaddr)銆?span>sendto 鍑芥暟涔熻繑鍥炲疄闄呭彂閫佺殑鏁版嵁瀛楄妭闀垮害鎴栧湪鍑虹幇鍙戦侀敊璇椂榪斿洖-1銆?span>
銆銆recvfrom()鍑芥暟鍘熷瀷涓猴細
銆銆int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
銆銆from鏄竴涓?span>struct sockaddr綾誨瀷鐨勫彉閲忥紝璇ュ彉閲忎繚瀛樻簮鏈虹殑IP鍦板潃鍙婄鍙e彿銆?span>fromlen甯哥疆涓?span>sizeof (struct sockaddr)銆傚綋recvfrom()榪斿洖鏃訛紝fromlen鍖呭惈瀹為檯瀛樺叆from涓殑鏁版嵁瀛楄妭鏁般?span>recvfrom()鍑芥暟榪斿洖鎺ユ敹鍒扮殑瀛楄妭鏁版垨褰撳嚭鐜伴敊璇椂榪斿洖-1錛屽茍緗浉搴旂殑errno銆?span>
銆銆濡傛灉浣犲鏁版嵁鎶?span>socket璋冪敤浜?span>connect()鍑芥暟鏃訛紝浣犱篃鍙互鍒╃敤send()鍜?span>recv()榪涜鏁版嵁浼犺緭錛屼絾璇?span>socket浠嶇劧鏄暟鎹姤socket錛屽茍涓斿埄鐢ㄤ紶杈撳眰鐨?span>UDP鏈嶅姟銆備絾鍦ㄥ彂閫佹垨鎺ユ敹鏁版嵁鎶ユ椂錛屽唴鏍鎬細鑷姩涓轟箣鍔犱笂鐩湴鍜屾簮鍦板潃淇℃伅銆?span>
銆銆緇撴潫浼犺緭
銆銆褰撴墍鏈夌殑鏁版嵁鎿嶄綔緇撴潫浠ュ悗錛屼綘鍙互璋冪敤close()鍑芥暟鏉ラ噴鏀捐socket錛屼粠鑰屽仠姝㈠湪璇?span>socket涓婄殑浠諱綍鏁版嵁鎿嶄綔錛?span>
銆銆close(sockfd);
銆銆浣犱篃鍙互璋冪敤shutdown()鍑芥暟鏉ュ叧闂socket銆傝鍑芥暟鍏佽浣犲彧鍋滄鍦ㄦ煇涓柟鍚戜笂鐨勬暟鎹紶杈擄紝鑰屼竴涓柟鍚戜笂鐨勬暟鎹紶杈撶戶緇繘琛屻傚浣犲彲浠ュ叧闂煇socket鐨勫啓鎿嶄綔鑰屽厑璁哥戶緇湪璇?span>socket涓婃帴鍙楁暟鎹紝鐩磋嚦璇誨叆鎵鏈夋暟鎹?span>
銆銆int shutdown(int sockfd,int how);
銆銆sockfd鏄渶瑕佸叧闂殑socket鐨勬弿榪扮銆傚弬鏁?span> how鍏佽涓?span>shutdown鎿嶄綔閫夋嫨浠ヤ笅鍑犵鏂瑰紡錛?span>
·0-------涓嶅厑璁哥戶緇帴鏀舵暟鎹?span>
·1-------涓嶅厑璁哥戶緇彂閫佹暟鎹?span>
·2-------涓嶅厑璁哥戶緇彂閫佸拰鎺ユ敹鏁版嵁錛?span>
·鍧囦負涓嶅厑璁稿垯璋冪敤close()
銆銆shutdown鍦ㄦ搷浣滄垚鍔熸椂榪斿洖0錛屽湪鍑虹幇閿欒鏃惰繑鍥?span>-1騫剁疆鐩稿簲errno銆?span>
闈㈠悜榪炴帴鐨?span>Socket瀹炰緥
銆銆浠g爜瀹炰緥涓殑鏈嶅姟鍣ㄩ氳繃socket榪炴帴鍚戝鎴風鍙戦佸瓧絎︿覆"Hello, you are connected!"銆傚彧瑕佸湪鏈嶅姟鍣ㄤ笂榪愯璇ユ湇鍔″櫒杞歡錛屽湪瀹㈡埛绔繍琛屽鎴瘋蔣浠訛紝瀹㈡埛绔氨浼氭敹鍒拌瀛楃涓層?span>
銆銆璇ユ湇鍔″櫒杞歡浠g爜濡備笅錛?span>
|
#include |
銆銆鏈嶅姟鍣ㄧ殑宸ヤ綔嫻佺▼鏄繖鏍風殑錛氶鍏堣皟鐢?span>socket鍑芥暟鍒涘緩涓涓?span>Socket錛岀劧鍚庤皟鐢?span>bind鍑芥暟灝嗗叾涓庢湰鏈哄湴鍧浠ュ強涓涓湰鍦扮鍙e彿緇戝畾錛岀劧鍚庤皟鐢?span>listen鍦ㄧ浉搴旂殑socket涓婄洃鍚紝褰?span>accpet鎺ユ敹鍒頒竴涓繛鎺ユ湇鍔¤姹傛椂錛屽皢鐢熸垚涓涓柊鐨?span>socket銆傛湇鍔″櫒鏄劇ず璇ュ鎴鋒満鐨?span>IP鍦板潃錛屽茍閫氳繃鏂扮殑socket鍚戝鎴風鍙戦佸瓧絎︿覆"Hello錛?span>you are connected!"銆傛渶鍚庡叧闂socket銆?/span>
銆銆浠g爜瀹炰緥涓殑fork()鍑芥暟鐢熸垚涓涓瓙榪涚▼鏉ュ鐞嗘暟鎹紶杈撻儴鍒嗭紝fork()璇彞瀵逛簬瀛愯繘紼嬭繑鍥炵殑鍊間負0銆傛墍浠ュ寘鍚?span>fork鍑芥暟鐨?span>if璇彞鏄瓙榪涚▼浠g爜閮ㄥ垎錛屽畠涓?span>if璇彞鍚庨潰鐨勭埗榪涚▼浠g爜閮ㄥ垎鏄茍鍙戞墽琛岀殑銆?span>
銆銆瀹㈡埛绔▼搴忎唬鐮佸涓嬶細
|
#include |
瀹㈡埛绔▼搴忛鍏堥氳繃鏈嶅姟鍣ㄥ煙鍚嶈幏寰楁湇鍔″櫒鐨?span>IP鍦板潃錛岀劧鍚庡垱寤轟竴涓?span>socket錛岃皟鐢?span>connect鍑芥暟涓庢湇鍔″櫒寤虹珛榪炴帴錛岃繛鎺ユ垚鍔熶箣鍚庢帴鏀朵粠鏈嶅姟鍣ㄥ彂閫佽繃鏉ョ殑鏁版嵁錛屾渶鍚庡叧闂?span>socket銆?/span>
銆銆鍑芥暟gethostbyname()鏄畬鎴愬煙鍚嶈漿鎹㈢殑銆傜敱浜?span>IP鍦板潃闅句互璁板繂鍜岃鍐欙紝鎵浠ヤ負浜嗘柟渚匡紝浜轟滑甯稿父鐢ㄥ煙鍚嶆潵琛ㄧず涓繪満錛岃繖灝遍渶瑕佽繘琛屽煙鍚嶅拰IP鍦板潃鐨勮漿鎹€傚嚱鏁板師鍨嬩負錛?/span>
|
銆銆struct hostent *gethostbyname(const char *name); |
銆銆褰?span> gethostname()璋冪敤鎴愬姛鏃訛紝榪斿洖鎸囧悜struct hosten鐨勬寚閽堬紝褰撹皟鐢ㄥけ璐ユ椂榪斿洖-1銆傚綋璋冪敤gethostbyname鏃訛紝浣犱笉鑳戒嬌鐢?span>perror()鍑芥暟鏉ヨ緭鍑洪敊璇俊鎭紝鑰屽簲璇ヤ嬌鐢?span>herror()鍑芥暟鏉ヨ緭鍑恒?span>
銆銆鏃犺繛鎺ョ殑瀹㈡埛/鏈嶅姟鍣ㄧ▼搴忕殑鍦ㄥ師鐞嗕笂鍜岃繛鎺ョ殑瀹㈡埛/鏈嶅姟鍣ㄦ槸涓鏍風殑錛屼袱鑰呯殑鍖哄埆鍦ㄤ簬鏃犺繛鎺ョ殑瀹㈡埛/鏈嶅姟鍣ㄤ腑鐨勫鎴蜂竴鑸笉闇瑕佸緩绔嬭繛鎺ワ紝鑰屼笖鍦ㄥ彂閫佹帴鏀舵暟鎹椂錛岄渶瑕佹寚瀹氳繙绔満鐨勫湴鍧銆?span>
銆銆闃誨鍜岄潪闃誨
銆銆闃誨鍑芥暟鍦ㄥ畬鎴愬叾鎸囧畾鐨勪換鍔′互鍓嶄笉鍏佽紼嬪簭璋冪敤鍙︿竴涓嚱鏁般備緥濡傦紝紼嬪簭鎵ц涓涓鏁版嵁鐨勫嚱鏁拌皟鐢ㄦ椂錛屽湪姝ゅ嚱鏁板畬鎴愯鎿嶄綔浠ュ墠灝嗕笉浼氭墽琛屼笅涓紼嬪簭璇彞銆傚綋鏈嶅姟鍣ㄨ繍琛屽埌accept璇彞鏃訛紝鑰屾病鏈夊鎴瘋繛鎺ユ湇鍔¤姹傚埌鏉ワ紝鏈嶅姟鍣ㄥ氨浼氬仠姝㈠湪accept璇彞涓婄瓑寰呰繛鎺ユ湇鍔¤姹傜殑鍒版潵銆傝繖縐嶆儏鍐電О涓洪樆濉烇紙blocking錛夈傝岄潪闃誨鎿嶄綔鍒欏彲浠ョ珛鍗沖畬鎴愩傛瘮濡傦紝濡傛灉浣犲笇鏈涙湇鍔″櫒浠呬粎娉ㄦ剰媯鏌ユ槸鍚︽湁瀹㈡埛鍦ㄧ瓑寰呰繛鎺ワ紝鏈夊氨鎺ュ彈榪炴帴錛屽惁鍒欏氨緇х畫鍋氬叾浠栦簨鎯咃紝鍒欏彲浠ラ氳繃灝?span>Socket璁劇疆涓洪潪闃誨鏂瑰紡鏉ュ疄鐜般傞潪闃誨socket鍦ㄦ病鏈夊鎴峰湪絳夊緟鏃跺氨浣?span>accept璋冪敤绔嬪嵆榪斿洖銆?span>
銆銆#include
銆銆#include
銆銆……
sockfd = socket(AF_INET,SOCK_STREAM,0);
fcntl(sockfd,F_SETFL,O_NONBLOCK)錛?span>
……
銆銆閫氳繃璁劇疆socket涓洪潪闃誨鏂瑰紡錛屽彲浠ュ疄鐜?span>"杞"鑻ュ共Socket銆傚綋浼佸浘浠庝竴涓病鏈夋暟鎹瓑寰呭鐞嗙殑闈為樆濉?span>Socket璇誨叆鏁版嵁鏃訛紝鍑芥暟灝嗙珛鍗寵繑鍥烇紝榪斿洖鍊間負-1錛屽茍緗?span>errno鍊間負EWOULDBLOCK銆備絾鏄繖縐?span>"杞"浼氫嬌CPU澶勪簬蹇欑瓑寰呮柟寮忥紝浠庤岄檷浣庢ц兘錛屾氮璐圭郴緇熻祫婧愩傝岃皟鐢?span>select()浼氭湁鏁堝湴瑙e喅榪欎釜闂錛屽畠鍏佽浣犳妸榪涚▼鏈韓鎸傝搗鏉ワ紝鑰屽悓鏃朵嬌緋葷粺鍐呮牳鐩戝惉鎵瑕佹眰鐨勪竴緇勬枃浠舵弿榪扮鐨勪換浣曟椿鍔紝鍙紜鍦ㄤ換浣曡鐩戞帶鐨勬枃浠舵弿榪扮涓婂嚭鐜版椿鍔紝select()璋冪敤灝嗚繑鍥炴寚紺鴻鏂囦歡鎻忚堪絎﹀凡鍑嗗濂界殑淇℃伅錛屼粠鑰屽疄鐜頒簡涓鴻繘紼嬮夊嚭闅忔満鐨勫彉鍖栵紝鑰屼笉蹇呯敱榪涚▼鏈韓瀵硅緭鍏ヨ繘琛屾祴璇曡屾氮璐?span>CPU寮閿銆?span>select鍑芥暟鍘熷瀷涓?span>:
int select(int numfds,fd_set *readfds,fd_set *writefds錛?span>
fd_set *exceptfds,struct timeval *timeout);
銆銆鍏朵腑readfds銆?span>writefds銆?span>exceptfds鍒嗗埆鏄select()鐩戣鐨勮銆佸啓鍜屽紓甯稿鐞嗙殑鏂囦歡鎻忚堪絎﹂泦鍚堛傚鏋滀綘甯屾湜紜畾鏄惁鍙互浠庢爣鍑嗚緭鍏ュ拰鏌愪釜socket鎻忚堪絎﹁鍙栨暟鎹紝浣犲彧闇瑕佸皢鏍囧噯杈撳叆鐨勬枃浠舵弿榪扮0鍜岀浉搴旂殑sockdtfd鍔犲叆鍒?span>readfds闆嗗悎涓紱numfds鐨勫兼槸闇瑕佹鏌ョ殑鍙風爜鏈楂樼殑鏂囦歡鎻忚堪絎﹀姞1錛岃繖涓緥瀛愪腑numfds鐨勫煎簲涓?span>sockfd+1錛涘綋select榪斿洖鏃訛紝readfds灝嗚淇敼錛屾寚紺烘煇涓枃浠舵弿榪扮宸茬粡鍑嗗琚鍙栵紝浣犲彲浠ラ氳繃FD_ISSSET()鏉ユ祴璇曘備負浜嗗疄鐜?span>fd_set涓搴旂殑鏂囦歡鎻忚堪絎︾殑璁劇疆銆佸浣嶅拰嫻嬭瘯錛屽畠鎻愪緵浜嗕竴緇勫畯錛?span>
銆銆FD_ZERO(fd_set *set)----娓呴櫎涓涓枃浠舵弿榪扮闆嗭紱
銆銆FD_SET(int fd,fd_set *set)----灝嗕竴涓枃浠舵弿榪扮鍔犲叆鏂囦歡鎻忚堪絎﹂泦涓紱
銆銆FD_CLR(int fd,fd_set *set)----灝嗕竴涓枃浠舵弿榪扮浠庢枃浠舵弿榪扮闆嗕腑娓呴櫎錛?span>
銆銆FD_ISSET(int fd,fd_set *set)----璇曞垽鏂槸鍚︽枃浠舵弿榪扮琚疆浣嶃?span>
銆銆Timeout鍙傛暟鏄竴涓寚鍚?span>struct timeval綾誨瀷鐨勬寚閽堬紝瀹冨彲浠ヤ嬌select()鍦ㄧ瓑寰?span>timeout闀挎椂闂村悗娌℃湁鏂囦歡鎻忚堪絎﹀噯澶囧ソ鍗寵繑鍥炪?span>struct timeval鏁版嵁緇撴瀯涓猴細
銆銆struct timeval {
銆銆 int tv_sec; /* seconds */
銆銆 int tv_usec; /* microseconds */ };
銆銆POP3瀹㈡埛绔疄渚?span>
銆銆涓嬮潰鐨勪唬鐮佸疄渚嬪熀浜?span>POP3鐨勫鎴峰崗璁紝涓庨偖浠舵湇鍔″櫒榪炴帴騫跺彇鍥炴寚瀹氱敤鎴峰笎鍙風殑閭歡銆備笌閭歡鏈嶅姟鍣ㄤ氦浜掔殑鍛戒護瀛樺偍鍦ㄥ瓧絎︿覆鏁扮粍POPMessage涓紝紼嬪簭閫氳繃涓涓?span>do-while寰幆渚濇鍙戦佽繖浜涘懡浠ゃ?span>
|
#include main(int argc, char *argv[]){ if((host=gethostbyname("your.server"))==NULL) { do { iLength=recv(sockfd,buf+iEnd,sizeof(buf)-iEnd,0); iMsg++; close(sockfd); |