锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍙傝緗戝潃: http://baike.baidu.com/view/6757218.htm
For message-oriented sockets, data is extracted from the first enqueued message, up to the size of the buffer specified. If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost. 瀛楄妭欏哄簭鏄寚鍗犲唴瀛樺浜庝竴涓瓧鑺傜被鍨嬬殑鏁版嵁鍦ㄥ唴瀛樹腑鐨勫瓨鏀鵑『搴忥紝閫氬父鏈夊皬绔佸ぇ绔袱縐嶅瓧鑺傞『搴忋?/span> 灝忕瀛楄妭搴忔寚浣庡瓧鑺傛暟鎹瓨鏀懼湪鍐呭瓨浣庡湴鍧澶勶紝楂樺瓧鑺傛暟鎹瓨鏀懼湪鍐呭瓨楂樺湴鍧澶勶紱 澶х瀛楄妭搴忔槸楂樺瓧鑺傛暟鎹瓨鏀懼湪浣庡湴鍧澶勶紝浣庡瓧鑺傛暟鎹瓨鏀懼湪楂樺湴鍧澶勩?/span> 鍩轟簬X86騫沖彴鐨?/font>PC鏈烘槸灝忕瀛楄妭搴忕殑 緗戠粶瀛楄妭搴? MSB 楂樺瓧鑺傚墠瀛樻硶 Most Significant Bit (Big Edian) 涓繪満瀛楄妭搴? LSB 浣庡瓧鑺傚墠瀛樻硶 Lest Significant Bit (Little Edian)
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
int so_broadcast=1;
int ret;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 1;
}
SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return 1;
}
err = setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(char*)&so_broadcast,sizeof(so_broadcast));
if ( err != 0 ) {
printf("Error at setsockopt(): %ld\n", WSAGetLastError() );
WSACleanup();
return 1;
}
char buf[256];
sprintf(buf,"%d",12345678);
sockaddr_in addr;
addr.sin_family = AF_INET;
//鍙楅檺騫挎挱鍦板潃,闇瑕佽緗皟鐢╯etsockopt(),鐢⊿O_BROADCAST閫夐」!
//addr.sin_addr.s_addr = inet_addr( "255.255.255.255");
//鐩存帴騫挎挱鍦板潃
addr.sin_addr.s_addr = inet_addr( "192.168.1.255");
addr.sin_port = htons( 5005);
ret = sendto(fd,buf,strlen(buf)+1,0,(sockaddr*)&addr,sizeof(addr));
printf("sended len=%d \n",ret);
if (ret==-1){
err = WSAGetLastError();
printf("err=%d \n",err);
}
WSACleanup();
return 0;
}
]]>
]]>
#include <stdlib.h>
#include <string.h>
#include <vector>
#ifdef WIN32
#include <WinSock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")
//end WIN32
#else //Linux
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif //end Linux
typedef std::vector<struct in_addr> array_in_addr;
int GetHostsByName( const char *host_name,array_in_addr* pArrayaddr)
{
int n=0;
struct addrinfo hints,*res;
struct addrinfo* p_addrinfo = NULL;
memset( &hints,0,sizeof(struct addrinfo) );
hints.ai_flags = AI_CANONNAME; //瀹㈡埛绔竴鑸氨鐢ㄨ繖涓?nbsp;AI_CANONNAME,鏈嶅姟绔緩璁敤:AI_PASSIVE
hints.ai_family = AF_INET; //AF_INET:IPv4 ,AF_INET6:IPv6
hints.ai_socktype = SOCK_STREAM; //IPPROTO_IP 鍙兘浼氫駭鐢熷涓噸澶岻P
sockaddr_in* p_sockaddr_in;
if( (n = getaddrinfo( host_name,NULL, &hints, &res) ) != 0)
return 0;
printf("domain:%s \r\n",host_name);
p_addrinfo = res;
while(p_addrinfo!=NULL)
{
pArrayaddr->push_back( ((sockaddr_in*)p_addrinfo->ai_addr)->sin_addr);
printf("ip%d: %s \r\n",pArrayaddr->size(),inet_ntoa(((sockaddr_in*)p_addrinfo->ai_addr)->sin_addr));
p_addrinfo = p_addrinfo->ai_next;
}
freeaddrinfo(res);
return pArrayaddr->size();
}
int main(int argc, char *argv[])
{
int nRet;
const char* pszHost = NULL;
array_in_addr inaddrs;
if (argc != 2) {
printf("Usage:%s <hostname> \r\n",argv[0]);
return -1;
}
pszHost = argv[1];
#ifdef WIN32
WSADATA wsaData;
int err = WSAStartup( 0x0202, &wsaData );
if ( err != 0 ) {
printf("socket init(WSAStartup) failure \r\n");
return 1;
}
#endif
GetHostsByName(pszHost,&inaddrs);
#ifdef WIN32
WSACleanup();
#endif
return 0;
}
]]>
]]>
1.UDP鍙戝寘鐨勯棶棰?br />闂細udp 鍙戦佷袱嬈℃暟鎹紝絎竴嬈?nbsp;100瀛楄妭 錛岀浜屾200瀛楄妭錛?nbsp;鎺ュ寘鏂逛竴嬈ecvfrom( 1000 ), 鏀跺埌鏄?nbsp;100錛岃繕鏄?00錛岃繕鏄?00錛?br />絳旓細UDP鏄暟鎹姤鏂囧崗璁紝鏄互鏁版嵁鍖呮柟寮忥紝鎵浠ユ瘡嬈″彲浠ユ帴鏀?00錛?/span>200錛屽湪鐞嗘兂鎯呭喌涓嬶紝絎竴嬈℃槸鏃犺recvfrom澶氬皯閮芥槸鎺ユ敹鍒?00銆傚綋鐒訛紝鍙兘鐢變簬緗戠粶鍘熷洜錛岀浜屼釜鍖呭厛鍒扮殑璇濓紝鏈夊彲鑳芥槸200浜嗐傚鍙兘浼氱敱浜庣綉緇滃師鍥犱貢搴忥紝鎵浠ュ彲鑳藉厛鏀跺埌200錛屾墍浠ヨ嚜瀹氫箟鐨剈dp鍗忚鍖呭ご閲岄兘瑕佸姞涓婁竴涓簭鍒楀彿錛屾爣璇嗗彂閫佷笌鏀跺寘瀵瑰簲
2.TCP鐨勫彂鍖呴棶棰?br />闂細鍚屾牱濡傛灉鎹㈡垚tcp, 絎竴嬈″彂閫?nbsp;100瀛楄妭 錛岀浜屾鍙戦?00瀛楄妭錛宺ecv( 1000 )浼氭帴鏀跺埌澶氬皯錛?br />絳旓細tcp鏄祦鍗忚錛屾墍浠ecv( 1000 )錛屼細鏀跺埌300 tcp鑷繁澶勭悊濂戒簡閲嶄紶錛屼繚璇佹暟鎹寘鐨勫畬鏁存?br />
3.鏈夊垎鐗囩殑鎯呭喌涓嬪涓嬪鐞?br />闂細濡傛灉MTU鏄?500錛屼嬌鐢║DP鍙戦?nbsp;2000錛岄偅涔坮ecvfrom(2000)鏄敹鍒?500錛岃繕鏄?000?
絳旓細 榪樻槸鎺ユ敹2000錛屾暟鎹垎鐗囩敱ip灞傚鐞嗕簡錛屾斁鍒皍dp榪樻槸涓涓畬鏁寸殑鍖呫傛帴鏀跺埌鐨勫寘鏄敱璺敱璺緞涓婃渶灝戠殑MTU鏉ュ垎鐗囷紝娉ㄦ剰杞埌UDP宸茬粡鍦ㄦ槸緇勮濂界殑(緇勮鍑洪敊鐨勫寘浼氱粡crc鏍¢獙鍑洪敊鑰屼涪寮?錛屾槸涓涓畬鏁寸殑鏁版嵁鍖?br />
4.鍒嗙墖鍚庣殑澶勭悊
闂細濡傛灉500閭d釜鐗囦涪浜嗘庝箞鍔烇紵udp鍙堟病鏈夐噸浼?br />絳旓細udp閲屾湁涓猚rc媯楠岋紝濡傛灉鍖呬笉瀹屾暣灝變細涓㈠純錛屼篃涓嶄細閫氱煡鏄惁鎺ユ敹鎴愬姛錛屾墍浠DP鏄笉鍙潬鐨勪紶杈撳崗璁紝鑰屼笖TCP涓嶅瓨鍦ㄨ繖涓棶棰橈紝鏈夎嚜宸辯殑閲嶄紶鏈哄埗銆傚湪鍐呯綉鏉ヨ錛孶DP鍩烘湰涓嶄細鏈変涪鍖咃紝鍙潬鎬ц繕鏄湁淇濋殰銆傚綋鐒跺鏋滄槸瑕佹眰鏈夋椂搴忔у拰楂樺彲闈犳э紝榪樻槸璧癟CP錛屼笉鐒跺氨瑕佽嚜宸辨彁渚涢噸浼犲拰涔卞簭澶勭悊( UDP鍐呯綉鍙戝寘澶勭悊閲忓彲浠ヨ揪 7w~10w/s )
5.涓嶅悓榪炴帴鍒板悓涓涓鍙g殑鍖呭鐞?br />闂細TCP
A -> C 鍙?00
B -> C 鍙?00
AB鍚屾椂鍚屼竴绔彛
C recv(1000) ,浼氭敹鍒板灝戯紵
絳旓細A涓嶤鏄竴涓猼cp榪炴帴錛孊涓嶤鍙堟槸鍙︿竴涓猼cp榪炴帴錛?nbsp;鎵浠ヤ笉鍚宻ocket錛屾墍浠ュ垎寮澶勭悊銆傛瘡涓猻ocket鏈夎嚜宸辯殑鎺ユ敹緙撳啿鍜屽彂閫佺紦鍐?br />
6.浠涔堟槸TCP綺樺寘
鐢變簬TCP鏄祦鍗忚錛屽浜庝竴涓猻ocket鐨勫寘錛屽鍙戦?nbsp;10AAAAABBBBB涓ゆ錛岀敱浜庣綉緇滃師鍥犵涓嬈″張鍒嗘垚涓ゆ鍙戦侊紝 10AAAAAB鍜孊BBB錛屽鏋滄帴鍖呯殑鏃跺欏厛璇誨彇10(鍖呴暱搴?鍐嶈鍏ュ悗緇暟鎹紝褰撴帴鏀跺緱蹇紝鍙戦佺殑鎱㈡椂錛屽氨浼氬嚭鐜板厛鎺ユ敹浜?nbsp;10AAAAAB,浼氳В閲婇敊璇?nbsp;,鍐嶆帴鍒板埌BBBB10AAAAABBBBB錛屼篃瑙i噴閿欒鐨勬儏鍐點傝繖灝辨槸TCP鐨勭矘鍖呫?br /> 瑙e喅鐨勫姙娉昑LV鏂瑰紡錛屽厛鎺ユ敹鍖呭ご錛屽湪鍖呭ご閲屾寚瀹氬寘浣撻暱搴︽潵鎺ユ敹銆傝緗寘澶村寘灝劇殑媯鏌ヤ綅錛堝緹ょ┖闂?x2寮澶達紝0x3緇撴潫鏉ユ鏌ヤ竴涓寘鏄惁瀹屾暣錛夈傚浜嶵CP鏉ヨ錛?/span>1錛変笉瀛樺湪涓㈠寘錛岄敊鍖咃紝鎵浠ヤ笉浼氬嚭鐜版暟鎹嚭閿?nbsp;2錛夊鏋滃寘澶存嫻嬮敊璇紝鍗充負闈炴硶鎴栬呰姹傦紝鐩存帴閲嶇疆鍗沖彲
7.
]]>
typedef struct _tag_COMM_PACK_REQUEST
{
BYTE header[2]; //2瀛楄妭,鍗忚澶?/span>
UINT64 requestID; //8瀛楄妭,嫻佹按鍙?/span>
BYTE entryType; //1瀛楄妭,鍔犲瘑綾誨瀷
DWORD cmd; //4瀛楄妭,鍛戒護
DWORD dataLen; //4瀛楄妭,鏁版嵁闀垮害
BYTE checksum; //1瀛楄妭,鏍¢獙鍜?/span>
char data[0]; //0瀛楄妭,
}COMM_PACK_REQUEST; //鍏?20瀛楄妭
typedef struct _tag_COMM_PACK_RESPONSE
{
BYTE header[2]; //2瀛楄妭,鍗忚澶?/span>
UINT64 responseID; //8瀛楄妭,嫻佹按鍙?/span>
BYTE entryType; //1瀛楄妭,鍔犲瘑綾誨瀷
DWORD err; //4瀛楄妭,鍛戒護
DWORD dataLen; //4瀛楄妭,鏁版嵁闀垮害
BYTE checksum; //1瀛楄妭,鏍¢獙鍜?/span>
char data[0]; //0瀛楄妭,
}COMM_PACK_RESPONSE; //鍏?20瀛楄妭
#pragma pack()
#define COMM_PACK_REQUEST_SIZE sizeof(COMM_PACK_REQUEST)
#define COMM_PACK_RESPONSE_SIZE sizeof(COMM_PACK_RESPONSE)
]]>
//瀹㈡埛绔唬鐮?nbsp;62.cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 1234 /* Port that will be opened */
#define BACKLOG 5 /* Number of allowed connections */
#define MAXDATASIZE 4096
void process_cli(int connectfd,struct sockaddr_in client);
int main() {
int listenfd, connectfd; /* socket descriptors */
struct sockaddr_in server; /* server's address information */
struct sockaddr_in client; /* client's address information */
socklen_t sin_size;
/* Create TCP socket */
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
/* handle exception */
perror("Creating socket failed.\n");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
/* handle exception */
perror("Bind error.\n");
exit(1);
}
if(listen(listenfd,BACKLOG) == -1){ /* calls listen() */
perror("listen() error\n");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
while (1) {
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) {
perror("accept() error\n");
exit(1);
}
process_cli(connectfd, client);
}
close(listenfd);
}
void process_cli(int connectfd, struct sockaddr_in client)
{
int num;
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE];
/* prints client's IP */
printf("%s:%d Client was connected\n",inet_ntoa(client.sin_addr), ntohs( client.sin_port) );
while (1) {
num = recv(connectfd, recvbuf, MAXDATASIZE,0);
if (num == 0) {
close(connectfd);
printf("%s:%d Client was disconnected \n",inet_ntoa(client.sin_addr), ntohs( client.sin_port) );
break;
}
if (num == -1) {
perror("recv() error\n");
break;
}
printf("recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n",recvbuf[0],recvbuf[num-1],num);
recvbuf[num] = '\0';
printf("Received message From Client : %s\n",recvbuf);
for (int i = 0; i < num; i++) {
sendbuf[i] = recvbuf[num-i-1];
//printf("sendbuf[%d]:%d\n",i,sendbuf[i]);
}
//printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);
send(connectfd,sendbuf,num,0); /* send to the client welcome message */
}
close(connectfd); /* close connectfd */
}
]]>
//瀹㈡埛绔唬鐮?nbsp;62.cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 1234 /* Port that will be opened */
#define BACKLOG 5 /* Number of allowed connections */
#define MAXDATASIZE 4096
void process_cli(int connectfd,struct sockaddr_in client);
int main()
{
int listenfd, connectfd; /* socket descriptors */
pid_t pid;
struct sockaddr_in server; /* server's address information */
struct sockaddr_in client; /* client's address information */
socklen_t sin_size;
/* Create TCP socket */
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
/* handle exception */
perror("Creating socket failed.\n");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
/* handle exception */
perror("Bind error.\n");
exit(1);
}
if(listen(listenfd,BACKLOG) == -1){ /* calls listen() */
perror("listen() error\n");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
while(1)
{
/*accept connection */
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) {
perror("accept() error\n");
exit(1);
}
/* Create child process to service client */
if ((pid=fork())>0) {
/* parent process */
close(connectfd);
continue;
}
else if (pid==0) {
/*child process*/
close(listenfd);
process_cli(connectfd, client);
exit(0);
}
else {
perror("fork() error\n");
exit(0);
}
}
close(listenfd); /* close listenfd */
}
void process_cli(int connectfd, struct sockaddr_in client)
{
int num;
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE];
/* prints client's IP */
printf("%s:%d Client was connected\n",inet_ntoa(client.sin_addr), ntohs( client.sin_port) );
while (1) {
num = recv(connectfd, recvbuf, MAXDATASIZE,0);
if (num == 0) {
close(connectfd);
printf("%s:%d Client was disconnected \n",inet_ntoa(client.sin_addr), ntohs( client.sin_port) );
break;
}
if (num == -1) {
perror("recv() error\n");
break;
}
printf("recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n",recvbuf[0],recvbuf[num-1],num);
recvbuf[num] = '\0';
printf("Received message From Client : %s\n",recvbuf);
for (int i = 0; i < num; i++) {
sendbuf[i] = recvbuf[num-i-1];
//printf("sendbuf[%d]:%d\n",i,sendbuf[i]);
}
//printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);
send(connectfd,sendbuf,num,0); /* send to the client welcome message */
}
close(connectfd); /* close connectfd */
}
]]>
//g++ -o 64 64.cpp -lpthread
//瀹㈡埛绔唬鐮?nbsp;62.cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#define PORT 1234 /* Port that will be opened */
#define BACKLOG 5 /* Number of allowed connections */
#define MAXDATASIZE 4096
void process_cli(int connectfd,struct sockaddr_in client);
/* function to be executed by the new thread */
void* start_routine(void* arg);
struct ARG {
int connfd;
sockaddr_in client;
};
int main()
{
int listenfd, connectfd; /* socket descriptors */
pthread_t thread;
ARG *arg;
struct sockaddr_in server; /* server's address information */
struct sockaddr_in client; /* client's address information */
socklen_t sin_size;
/* Create TCP socket */
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
/* handle exception */
perror("Creating socket failed.\n");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
/* handle exception */
perror("Bind error.");
exit(1);
}
if(listen(listenfd,BACKLOG) == -1){ /* calls listen() */
perror("listen() error\n");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
while(1)
{
/* Accept connection */
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) {
perror("accept() error\n");
exit(1);
}
/* Create thread*/
arg = new ARG;
arg->connfd = connectfd;
memcpy((void *)&arg->client, &client, sizeof(client));
if (pthread_create(&thread, NULL, start_routine, (void*)arg)) {
/* handle exception */
perror("Pthread_create() error");
exit(1);
}
}
close(listenfd); /* close listenfd */
}
void process_cli(int connectfd, struct sockaddr_in client)
{
int num;
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE];
/* prints client's IP */
printf("%s:%d Client was connected\n",inet_ntoa(client.sin_addr), ntohs( client.sin_port) );
while (1) {
num = recv(connectfd, recvbuf, MAXDATASIZE,0);
if (num == 0) {
close(connectfd);
printf("%s:%d Client was disconnected \n",inet_ntoa(client.sin_addr), ntohs( client.sin_port) );
break;
}
if (num == -1) {
perror("recv() error\n");
break;
}
printf("recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n",recvbuf[0],recvbuf[num-1],num);
recvbuf[num] = '\0';
printf("Received message From Client : %s\n",recvbuf);
for (int i = 0; i < num; i++) {
sendbuf[i] = recvbuf[num-i-1];
//printf("sendbuf[%d]:%d\n",i,sendbuf[i]);
}
//printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);
send(connectfd,sendbuf,num,0); /* send to the client welcome message */
}
close(connectfd); /* close connectfd */
}
void* start_routine(void* arg)
{
ARG *info;
info = (ARG *)arg;
/* handle client’s requirement */
process_cli(info->connfd, info->client);
delete (ARG*)arg;
pthread_exit(NULL);
}
]]>
#include <iostream>
#include <map>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <bitset>
using namespace std;
#define PORT 1234 /* Port that will be opened */
#define BACKLOG 5 /* Number of allowed connections */
#define MAXDATASIZE 4096
typedef map<unsigned int,sockaddr_in> connects;
void process_cli(int sockfd,sockaddr_in addr,char* recvbuf, int len);
void reverser(char* szIn,char* szOut,unsigned int nLen)
{
for (int i=0;i<nLen;i++) {
szOut[i] = szIn[nLen-i-1];
}
}
int main()
{
connects connect_fds;
int sock_fd;
ssize_t recv_size;
fd_set read_set;
fd_set all_set;
int listen_fd;
int connect_fd;
int ready_size;
socklen_t addr_size;
sockaddr_in srv_addr;
sockaddr_in addr;
unsigned int max_fd = 0;
char recv_buf[MAXDATASIZE];
if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Creating socket failed.");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&srv_addr,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_port=htons(PORT);
srv_addr.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(listen_fd, (struct sockaddr *)&srv_addr, sizeof(struct sockaddr)) == -1) {
perror("Bind error.");
exit(1);
}
if(listen(listen_fd,BACKLOG) == -1) {
perror("listen() error\n");
exit(1);
}
max_fd = listen_fd;
addr_size=sizeof(sockaddr_in);
FD_ZERO(&all_set);
FD_SET(listen_fd, &all_set);
connects::iterator iter;
printf("clients:(%u) ,current listen socket:%u\n",connect_fds.size(),listen_fd);
while(1)
{
read_set = all_set;
ready_size = select(max_fd+1, &read_set, NULL, NULL, NULL);
if ( FD_ISSET(listen_fd,&read_set) ) {
connect_fd = accept(listen_fd,(struct sockaddr *)&addr,&addr_size);
if (connect_fd ==-1 ) {
perror("accept() error\n");
continue;
}
connect_fds[connect_fd] = addr;
max_fd = connect_fd;
FD_SET(connect_fd, &all_set);
printf("clients:(%u) ,%s:%d connected ,connect socket:%u\n",connect_fds.size(),inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),connect_fd);
}
for ( iter = connect_fds.begin(); iter!=connect_fds.end(); iter++) {
sock_fd = iter->first;
addr = iter->second;
if ( FD_ISSET(sock_fd,&read_set) ) {
recv_size = recv(sock_fd, recv_buf, MAXDATASIZE,0);
if ( recv_size == 0) {
close(sock_fd);
FD_CLR(sock_fd, &all_set);
connect_fds.erase(sock_fd);
printf("%s:%d disconnected\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port) );
}
else {
process_cli(sock_fd,addr,recv_buf,recv_size);
}
}
}
}
close(listen_fd);
}
void process_cli(int sockfd,sockaddr_in addr,char* recvbuf, int len)
{
char sendbuf[MAXDATASIZE];
printf("Received %s:%d message: %s\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port), recvbuf);
reverser(recvbuf,sendbuf,len);
printf("Send To %s:%d message: %s\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port), sendbuf);
send(sockfd,sendbuf,len,0);
}
]]>
銆銆/* Create new stream socket */
銆銆sock = socket ( AF_INET, SOCK_STREAM, 0 );
銆銆/* Disable the Nagle (TCP No Delay) algorithm */
銆銆flag = 1;
銆銆int ret = setsockopt ( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );
銆銆if (ret == -1) {
銆銆 printf("Couldn't setsockopt(TCP_NODELAY)\n");
銆銆 exit(-1);
銆銆}
]]>
int keepAlive = 1; //璁懼畾KeepAlive
int keepIdle = 30; //寮濮嬮嬈eepAlive鎺㈡祴鍓嶇殑TCP絀洪棴鏃墮棿
int keepInterval = 30; //涓ゆKeepAlive鎺㈡祴闂寸殑鏃墮棿闂撮殧
int keepCount = 3; //鍒ゅ畾鏂紑鍓嶇殑KeepAlive鎺㈡祴嬈℃暟
if(setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
printf("Socket Option setting(SO_KEEPALIVE) fail !\n");
return FALSE;
}
if(setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
{
printf("Socket Option setting(SO_KEEPALIVE) fail !\n");
return FALSE;
}
if(setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
{
printf("Socket Option setting(TCP_KEEPIDLE) fail !\n");
return FALSE;
}
if(setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
{
printf("Socket Option setting(TCP_KEEPCNT) fail !\n");
return FALSE;
}
]]>
鍥犱負鐜拌鐨勮綆楁満閮芥槸浠ュ叓浣嶄竴涓瓧鑺備負瀛樺偍鍗曚綅錛岄偅涔堜竴涓?6浣嶇殑鏁存暟錛屼篃灝辨槸C璇█涓殑short錛屽湪鍐呭瓨涓彲鑳芥湁涓ょ瀛樺偍欏哄簭big-endian鍜宭itte-endian銆傝冭檻涓涓猻hort鏁存暟0x3132(0x32鏄綆浣嶏紝0x31鏄珮浣?錛屾妸瀹冭祴鍊肩粰涓涓猻hort鍙橀噺錛岄偅涔堝畠鍦ㄥ唴瀛樹腑鐨勫瓨鍌ㄥ彲鑳芥湁濡備笅涓ょ鎯呭喌錛?br />
鍙互鍋氫釜瀹為獙
鍦╓indows涓婁笅濡備笅紼嬪簭
#include <stdio.h>
#include <assert.h>
int main(void)
{
short test;
FILE* fp;
test = 0x3132; /* (31ASIIC鐮佺殑'1', 32ASIIC鐮佺殑'2') */
if ((fp = fopen("c:\\test.txt", "wb")) == NULL)
assert(0);
fwrite(&test, sizeof(short), 1, fp);
fclose(fp);
return 0;
}
鐒跺悗鍦–鐩樹笅鎵撳紑test.txt鏂囦歡錛屽彲浠ョ湅瑙佸唴瀹規槸21錛岃宼est絳変簬0x3132錛屽彲浠ユ槑鏄劇殑鐪嬪嚭鏉86鐨勫瓧鑺傞『搴忔槸浣庝綅鍦ㄥ墠銆傚鏋滄垜浠妸榪欐鍚屾牱鐨勪唬鐮佹斁鍒?big-endian)鐨勬満鍣ㄤ笂鎵ц錛岄偅涔堟墦鍑烘潵鐨勬枃浠跺氨鏄?2銆傝繖鍦ㄦ湰鏈轟腑浣跨敤鏄病鏈夐棶棰樼殑銆備絾褰撲綘鎶婅繖涓枃浠朵粠涓涓猙ig-endian鏈哄櫒澶嶅埗鍒頒竴涓猯ittle-endian鏈哄櫒涓婃椂灝卞嚭鐜伴棶棰樹簡銆?br />
濡備笂榪頒緥瀛愶紝鎴戜滑鍦╞ig-endian鐨勬満鍣ㄤ笂鍒涘緩浜嗚繖涓猼est鏂囦歡錛屾妸鍏跺鍒跺埌little-endian鐨勬満鍣ㄤ笂鍐嶇敤fread璇誨埌涓涓猻hort閲岄潰錛屾垜浠緱鍒扮殑灝變笉鍐嶆槸0x3132鑰屾槸0x3231浜嗭紝榪欐牱璇誨埌鐨勬暟鎹氨鏄敊璇殑錛屾墍浠ュ湪涓や釜瀛楄妭欏哄簭涓嶄竴鏍風殑鏈哄櫒涓婁紶杈撴暟鎹椂闇瑕佺壒鍒皬蹇冨瓧鑺傞『搴忥紝鐞嗚В浜嗗瓧鑺傞『搴忓湪鍙互甯姪鎴戜滑鍐欏嚭縐繪琛屾洿楂樼殑浠g爜銆?br />
姝e洜涓烘湁瀛楄妭欏哄簭鐨勫樊鍒紝鎵浠ュ湪緗戠粶浼犺緭鐨勬椂鍊欏畾涔変簡鎵鏈夊瓧鑺傞『搴忕浉鍏崇殑鏁版嵁閮戒嬌鐢╞ig-endian錛孊SD鐨勪唬鐮佷腑瀹氫箟浜嗗洓涓畯鏉ョ悊錛?br />
#define ntohs(n) //緗戠粶瀛楄妭欏哄簭鍒頒富鏈哄瓧鑺傞『搴?nbsp;n浠h〃net, h浠h〃host, s浠h〃short
#define htons(n) //涓繪満瀛楄妭欏哄簭鍒扮綉緇滃瓧鑺傞『搴?nbsp;n浠h〃net, h浠h〃host, s浠h〃short
#define ntohl(n) //緗戠粶瀛楄妭欏哄簭鍒頒富鏈哄瓧鑺傞『搴?nbsp;n浠h〃net, h浠h〃host, s浠h〃long
#define htonl(n) //涓繪満瀛楄妭欏哄簭鍒扮綉緇滃瓧鑺傞『搴?nbsp;n浠h〃net, h浠h〃host, s浠h〃long