国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

windows網絡編程socket選項與廣播的實現

2019-11-06 06:35:41
字體:
來源:轉載
供稿:網友
調用getsockopt和setsocketopt可以查看和設置socket中的一些選項,比如socket是否處于監聽狀態,是否允許廣播,是否允許路由選擇等等。1.getsockopt()int getsockopt(SOCKET s,int level,int optname, char* optval, int* optlen)s:要查看的套接字level:選項的級別,有SOL_SOCKET,ipPROTO_TCP等optname是要查看的選項的名稱optval接受查看選項的結果optlen optval的長度比如以下例子,在listen監聽之前分別查看套接字的監聽情況(optname=SO_ACCEPTCONN)
// test.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include <stdio.h>#include "winsock2.h"#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")int main(){	WSADATA wsa;	if (WSAStartup(MAKEWord(2, 2), &wsa) != NO_ERROR)	{		printf("startup failed/n");	}	SOCKET listensocket;	sockaddr_in server;	int retval, optlen;	if ((listensocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)	{		printf("socket error/n");	}	hostent *phost;	u_short port = 9901;	server.sin_family = AF_INET;	server.sin_port = htons(port);	server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);	if (bind(listensocket, (sockaddr*)&server, sizeof(sockaddr)) == SOCKET_ERROR)	{		printf("%d",GetLastError());		printf("bind error/n");	}	optlen = sizeof(int);	getsockopt(listensocket, SOL_SOCKET, SO_ACCEPTCONN, (char*)&retval, &optlen);	printf("%ld/n", retval);	if (listen(listensocket, 3) == SOCKET_ERROR)	{		printf("listen error/n");	}	getsockopt(listensocket, SOL_SOCKET, SO_ACCEPTCONN, (char*)&retval, &optlen);	printf("%ld/n", retval);	return 0;}執行結果如下:監聽之前為0,監聽之后為12.setsockopt(SOCKET s,int level,int optname, const char* optval, int* optlen)五個參數的意義和getsockopt的意義很相近,只是第3個參數在這里表示要被設置的選項,第四個參數表示要設置的值,需要強制轉換為字符指針。當我們需要實現UDP廣播的時候,需要將socket設置為允許廣播,即
bool setopt = true;retval = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&setopt, sizeof(bool));然后將目的IP地址設為INADDR_BOARDCAST就行了。完整代碼如下:
// test.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include <stdio.h>#include "winsock2.h"#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")int main(){	WSADATA wsa;	int retval = WSAStartup(MAKEWORD(2, 2), &wsa);	if (retval == SOCKET_ERROR)	{		printf("start up failed/n");	}	SOCKET s;	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);	if (s == INVALID_SOCKET)	{		printf("socket failed/n");	}	bool setopt = true;	retval = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&setopt, sizeof(bool));	if (retval == SOCKET_ERROR)	{		printf("setsocketopt failed/n");	}	sockaddr_in fromaddr;	fromaddr.sin_family = AF_INET;	fromaddr.sin_port = htons(9000);	fromaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);	retval = bind(s, (sockaddr*)&fromaddr, sizeof(sockaddr));	if (retval == SOCKET_ERROR)	{		printf("bind failed/n");	}	sockaddr_in toaddr;	toaddr.sin_family = AF_INET;	toaddr.sin_port = htons(9001);	toaddr.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);	char buf[] = { "this is a boardcast" };	retval = sendto(s, buf, sizeof(buf), 0, (sockaddr*)&toaddr, sizeof(toaddr));	if (retval == SOCKET_ERROR)	{		printf("sendto failed/n");	}	WSACleanup();	closesocket(s);	return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金阳县| 东山县| 高尔夫| 舟曲县| 北辰区| 六枝特区| 绵阳市| 茌平县| 土默特右旗| 全椒县| 青神县| 共和县| 泰兴市| 抚松县| 遂宁市| 嘉禾县| 安阳县| 三门峡市| 盐亭县| 柳河县| 青神县| 海淀区| 昆明市| 林芝县| 安义县| 嘉禾县| 乌恰县| 满洲里市| 二连浩特市| 大英县| 揭东县| 昭通市| 德格县| 米脂县| 遂宁市| 镇远县| 茌平县| 江城| 抚顺县| 沂源县| 璧山县|