1.从Linux源码看Socket(TCP)的简单listen及连接队列
2.å¦ä½ç¼åç®åçsocketç½ç»ç¨åº å¦ä½ç¼ååºäºTCPåè®®çç½ç»ç¨åº
3.2024年度Linux6.9内核最新源码解读-网络篇-server端-第一步创建--socket
4.几个代码伪装成高级黑客
5.linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 ,。。源码源码谢谢
从Linux源码看Socket(TCP)的简单listen及连接队列
了解Linux内核中Socket (TCP)的"listen"及连接队列机制是深入理解网络编程的关键。本文将基于Linux 3.内核版本,源码源码从源码角度解析Server端Socket在进行"listen"时的简单具体实现。
建立Server端Socket需要经历socket、源码源码简单的macd指标源码bind、简单listen、源码源码accept四个步骤。简单本文聚焦于"listen"步骤,源码源码深入探讨其内部机理。简单
通过socket系统调用,源码源码我们可以创建一个基于TCP的简单Socket。这里直接展示了与TCP Socket相关联的源码源码操作函数。
接着,简单我们深入到"listen"系统调用。注意,glibc的INLINE_SYSCALL对返回值进行了封装,仅保留0和-1两种结果,并将错误码的绝对值记录在errno中。其中,backlog参数至关重要,负69的源码设置不当会引入隐蔽的陷阱。对于Java开发者而言,框架默认backlog值较小(默认),这可能导致微妙的行为差异。
进入内核源码栈,我们发现内核对backlog值进行了调整,限制其不超过内核参数设置的somaxconn值。
核心调用程序为inet_listen。其中,除了fastopen外的逻辑(fastopen将在单独章节深入讨论)最终调用inet_csk_listen_start,将sock链入全局的listen hash表,实现对SYN包的高效处理。
值得注意的是,SO_REUSEPORT特性允许不同Socket监听同一端口,实现内核级的负载均衡。Nginx 1.9.1版本启用此功能后,性能提升3倍。
半连接队列与全连接队列是连接处理中的关键组件。通常提及的sync_queue与accept_queue并非全貌,sync_queue实际上是syn_table,而全连接队列为icsk_accept_queue。额温枪 源码在三次握手过程中,这两个队列分别承担着不同角色。
在连接处理中,除了qlen与sk_ack_backlog计数器外,qlen_young计数器用于特定场景下的统计。SYN_ACK的重传定时器在内核中以ms为间隔运行,确保连接建立过程的稳定。
半连接队列的存在是为抵御半连接攻击,避免消耗大量内存资源。通过syn_cookie机制,内核能有效防御此类攻击。
全连接队列的最大长度受到限制,超过somaxconn值的连接会被内核丢弃。若未启用tcp_abort_on_overflow特性,客户端可能在调用时才会察觉到连接被丢弃。启用此特性或增大backlog值是应对这一问题的策略。
backlog参数对半连接队列容量产生影响,导致内核发送cookie校验时出现常见的内存溢出警告。
总结而言,TCP协议在数十年的演进中变得复杂,深入阅读源码成为分析问题的撩妹网站源码重要途径。本文深入解析了Linux内核中Socket (TCP)的"listen"及连接队列机制,旨在帮助开发者更深入地理解网络编程。
å¦ä½ç¼åç®åçsocketç½ç»ç¨åº å¦ä½ç¼ååºäºTCPåè®®çç½ç»ç¨åº
ããä¸é¢æ¯ä¸ªäººç¨äºä¸ä¸ªåéå·¦å³çæ¶é´ç¼åçç¨åºï¼å¨è¿ç¼åè¿ç¨ä¸ï¼é常éè¦çä¸ç¹å°±æ¯ï¼ è¦ç解 tcpåè®®ç¼åç¨åºçåçï¼å³ç¼åæå¡å¨ç«¯çè¿ç¨ï¼ä»¥åç¼å客æ·ç«¯çè¿ç¨ã åªè¦ææ¡è¿ä¸¤ç¹å°±å¯ä»¥å¾å®¹æç¼ååºæ¥äºï¼ä½æ¯è¦å¿«éç¼ååºè¿ä¸ªç¨åºï¼é£ä¹VC6.0å¼åå·¥å ·éï¼æ好è¦å®è£ ä¸ä¸ªçªèæ件ï¼è¿ä¸ªæ件å¯ä»¥å¿«éæé«ä½ çç¼åç¨åºçæçï¼è¿æä¹è¦å®è£ msdn ææ¡£ï¼è¿æ ·å¨ç¼åè¿ç¨ä¸ï¼éå°å¯¹æ个å½æ°çåæ°æ³ä¸å ¨çæ¶åï¼ä½¿ç¨msdnå°±è½å¿«éå¸®ä½ åå¿äºã åµåµï¼å¦æä½ é£ä¸å¤©å»é¢è¯ä¸å®¶çé¼çå ¬å¸çåï¼å¾æå¯è½å°±æ¯ å¨ç¬è¯å®æä¹åï¼å°±è¦è¿è¡æºè¯äºï¼è¿å°±å®å ¨èæ¥åºä½ ççæ£ç¼ç¨æ°´å¹³äºã è½å¨æçæ¶é´éå®æä¸ä¸ªsocketç½ç»ç¨åºï¼é£ä¹å°±å¯ä»¥ä»¤é¢è¯å®æå°é常满æäºã ä¸è¿ï¼è¿ä¸ªç¨åºï¼è¿æ²¡æè¿æ¥æ°æ®åºï¼ä»¥åå继ç»æäºã
ããå¦æä½ å»é¢è¯ æ·±å³ç§æå é£å®¶ ä¼æè¾¾ éå¢å ¬å¸ç软件工ç¨å¸çåï¼é£ä¹æºè¯é¢ç®å°±æ¯è¿ä¸ªã å½æ¶æå»é¢è¯ï¼é¦å è¿è¡ç¬è¯ï¼é¢è¯å®å¯¹æç¬è¯æ绩æ¯è¾æ»¡æï¼æ以就å«æçä¸æ¥åé¡¿é¥ï¼ä¸åè¿è¡æºè¯ã å½æ¶æåºèå²ä½æ¯Linuxç³»ç»å·¥ç¨å¸Cè¯è¨ï¼ å¯æ¯ç¬è¯é¢ç®ï¼ä¸ä½èæ ¸Cï¼è¿èæ ¸C++ï¼JavaScriptï¼htmlã ææè§å¥½å¥æªï¼å¿éæ³ï¼å¥½åææ¯åºèVC++å¼åé£ä¸ªå²ä½äºã äºæ¯æçå°ä¸åï¼ä»æ¿æ¥æºè¯é¢ç®ä¹æ¶ï¼æçæ£æç½ï¼æç¶æ¯ä»è¦å®ææä»äºVC++å¼åäºï¼é¢ç®å°±æ¯ï¼ç¼ååºäºTCP/IPåè®®ç½ç»ç¨åºï¼å¹¶å®ç°ç®åçè天ç¨åºï¼èä¸è¦è¿æ¥æ°æ®åºã å½æ¶æå失æäºã äºæ¯æå°±æåºï¼æä¸æ³åè¿ä¸ªé¢ç®ï¼å 为ææ¯æ³åºèLinuxç³»ç»Cè¯è¨å¼åçã å°±è¿æ ·å¤±æçèµ°äºã
ããä¸é¢æ¯ä¸ªäººå®å ¨è½è¿è¡ç代ç ï¼
ããæå¡å¨ç«¯æºç ï¼
ãã#include<stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_.lib")
ããint main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}
ããSOCKET socketServer=socket(AF_INET,SOCK_STREAM,0);
ããSOCKADDR_IN addrServer;
ããaddrServer.sin_family=AF_INET;
ããaddrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
ããaddrServer.sin_port=htons();
ããbind(socketServer, (struct sockaddr *)&addrServer, sizeof(struct sockaddr));
ããlisten(socketServer, 5);
ããSOCKADDR_IN addrClient;
ããint addrLen=sizeof(SOCKADDR_IN);
ããchar sendBuf[];
ããchar recvBuf[];
ããint i=1;
while(1)
{
printf("æå¡å¨ç«¯çå¾ ç¬¬%d个客æ·ç«¯è¿æ¥è¯·æ±...\n", i++);
ããSOCKET newsocketServer=accept(socketServer,(struct sockaddr *)&addrClient, &addrLen);
ããif(newsocketServer!=INVALID_SOCKET)
{
printf("æå¡å¨ç«¯ä¸å®¢æ·ç«¯è¿æ¥æå...\n");
}
ããmemset(sendBuf,0,);
ããsprintf(sendBuf,"Welcome you to come here");
ããsend(newsocketServer, sendBuf, strlen(sendBuf)+1,0);
ããmemset(recvBuf,0,);
ããrecv(newsocketServer,recvBuf,,0);
ããprintf("æå¡å¨ç«¯æ¶å°ä¿¡æ¯:%s\n",recvBuf);
ããclosesocket(newsocketServer);
}
ããWSACleanup();
ããreturn 0;
}
ããæ¤æç« æ¥èªäºä¸ªäººåå®¢ï¼ é¿æµªå客 /wenxianliang@/
ãã客æ·ç«¯æºç ï¼
ãã#include<stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_.lib")
ããint main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}
SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrServer;
addrServer.sin_family=AF_INET;
addrServer.sin_addr.S_un.S_addr=inet_addr(".0.0.1");
addrServer.sin_port=htons();
char sendBuf[];
char recvBuf[];
ããprintf("客æ·ç«¯åæå¡å¨ç«¯è¿æ¥è¯·æ±...\n");
ããint Isconnect=connect(socketClient, (struct sockaddr *)&addrServer, sizeof(struct sockaddr));
ããif(Isconnect!=0)
{
printf("客æ·ç«¯æ æ³è¿æ¥æå¡å¨ç«¯...\n");
ããreturn 0;
}
ããprintf("客æ·ç«¯å·²æåè¿æ¥æå¡å¨ç«¯...\n");
ããmemset(recvBuf,0,);
recv(socketClient,recvBuf,,0);
ããprintf("客æ·ç«¯æ¶å°ä¿¡æ¯:%s\n",recvBuf);
ããmemset(sendBuf,0,);
sprintf(sendBuf,"Hello , I am Mr Wen !");
send(socketClient, sendBuf, strlen(sendBuf)+1,0);
closesocket(socketClient);
WSACleanup();
return 0;
}
年度Linux6.9内核最新源码解读-网络篇-server端-第一步创建--socket
深入解析年Linux 6.9内核的网络篇,从服务端的第一步:创建socket开始。理解用户空间与内核空间的交互至关重要。当我们在用户程序中调用socket(AF_INET, SOCK_STREAM, 0),实际上是触发了从用户空间到内核空间的系统调用sys_socket(),这是创建网络连接的关键步骤。 首先,让我们关注sys_socket函数。这个函数在net/socket.c文件的位置,无论内核版本如何,都会调用__sys_socket_create函数来实际创建套接字,它接受地址族、类型、协议和结果指针。创建失败时,会返回错误指针。 在socket创建过程中,参数解析至关重要:网络命名空间(net):隔离网络环境,每个空间有自己的带源码娜美配置,如IP地址和路由。
协议族(family):如IPv4(AF_INET)或IPv6(AF_INET6)。
套接字类型(type):如流式(SOCK_STREAM)或数据报(SOCK_DGRAM)。
协议(protocol):如TCP(IPPROTO_TCP)或UDP(IPPROTO_UDP),默认值自动选择。
结果指针(res):指向新创建的socket结构体。
内核标志(kern):区分用户空间和内核空间的socket。
__sock_create函数处理创建逻辑,调用sock_map_fd映射文件描述符,支持O_CLOEXEC和O_NONBLOCK选项。每个网络协议族有其特有的create函数,如inet_create处理IPv4 TCP创建。 在内核中,安全模块如LSM会通过security_socket_create进行安全检查。sock_alloc负责内存分配和socket结构初始化,协议族注册和动态加载在必要时进行。RCU机制保护数据一致性,确保在多线程环境中操作的正确性。 理解socket_wq结构体对于异步IO至关重要,它协助socket管理等待队列和通知。例如,在TCP协议族的inet_create函数中,会根据用户请求找到匹配的协议,并设置相关的操作集和数据结构。 通过源码,我们可以看到socket和sock结构体的关系,前者是用户空间操作的抽象,后者是内核处理网络连接的实体。理解这些细节有助于我们更好地编写C++网络程序。 此外,原始套接字(如TCP、UDP和CMP)的应用示例,以及对不同协议的深入理解,如常用的IP协议、专用协议和实验性协议,是进一步学习和实践的重要部分。几个代码伪装成高级黑客
1. Introduction
作为计算机科学领域中最为著名的职业之一,黑客在当前的网络时代中有着不可忽视的作用。高级黑客更是其中的佼佼者,他们不仅具备了深厚的计算机技术知识,更能够使用各种技术手段,无中生有、突破困境、扰乱秩序等,令人望尘莫及。本文将会介绍一些简单的代码,让大家了解如何通过伪装成高级黑客,获得与众不同、且备受他人崇拜的感受。
2. 建立IP连接
在Python中,我们可以使用socket库来建立一个IP连接,并实现从目标服务器上获取数据的操作,下面是一段伪装成高级黑客的代码:
```python
import socket
def conn(IP, Port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((IP,Port))
while True:
data = client.recv()
print (\'receive:\', data.decode()) #将获取到的数据进行解码
client.send(\'ACK!\'.encode()) #发送一个确认信息
if __name__ == \'__main__\':
conn(\'.0.0.1\', )
```
通过以上代码,我们可以连接到指定的服务器和对应的端口,获取到服务器发送的数据,并且能够对服务器返回一份确认信息,同时也向别人表现出伪装成高级黑客,游刃有余的状态。
3. 文件域修改
文件域修改是黑客行业中非常重要的一环,它可以改变一个可编辑文件中特定寻址位置的值。这个方法可以被用来对各种各样的文件(如二进制文件)进行操控。下列的Python代码可以让你的伪装更加漂亮:
```python
import struct
import os
def change_value(file_path, offset, value):
with open(file_path, \"r+b\") as f:
f.seek(offset)
f.write(struct.pack(\'i\', value))
if __name__ == \"__main__\":
file_path = \"/etc/hosts\"
offset =
value =
change_value(file_path, offset, value)
```
以上代码用到了struct结构体和os模块,使用`r+`文件模式打开指定的文件,通过file.seek()方法改变寻址位置,最后使用`struct.pack()`方法打包整数,并使用write()方法写入文件中。当写入完成后,文件中的值也随之更改。这时,你已成为了一个擅长黑客技术的“高手”。
4. 网络嗅探
网络嗅探是指在一个网络中抓取和记录经过网络的信息,并对这些信息进行分析。在现代网络安全领域中,网络嗅探被广泛地应用于网络审计和攻击检测。下面是一个伪装成高级黑客的Python代码示例,可以用于嗅探TCP流量包:
```python
import socket
def sniffTCP(port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
sock.bind((\'.0.0.1\', port))
while True:
packet = sock.recvfrom()[0]
ip_header = packet[0:]
tcp_header = packet[:]
print(\"TCP Source Port: %d\" % ord(tcp_header[0]))
except KeyboardInterrupt:
print(\'Interrupted.\')
if __name__ == \"__main__\":
sniffTCP()
```
上述程序使用Python的socket库来监听指定的端口,收集包含TCP流量的数据报,并在控制台输出源端口号。此时,你已经成为一个懂得TCP嗅探技术的黑客了。
5. 爬取网页信息
网络爬虫被广泛用于百度和谷歌搜索引擎中,通过分析网页的源代码,检查网站的链接,实现数据抓取和分析。下面是一个伪装成高级黑客的Python代码示例,可以用于网页爬取,我们可以把以前熟悉的requests库和xpath技术结合运用。
```python
import requests
from lxml import html
def get_info(url):
page = requests.get(url)
tree = html.fromstring(page.content)
title = tree.xpath(\'//title\')[0].text_content()
print(\'Website Title:\', title)
links = tree.xpath(\'//a/@href\')
print(\'Links:\')
for link in links:
print(link)
if __name__ == \'__main__\':
get_info(\'\')
```
这些代码使用了requests和lxml库,获取页面内容并解析HTML,以提取指定节点的数据,如标题和链接。此时,在码量不大的情况下,你已成为一个懂得网页爬取技术的黑客了。
结论
以上提供的伪装成高级黑客的五个应用程序演示了Python的实用性和可扩展性。通过这些例子,我们可以使自己更好的了解Python,更好地思考如何在网络和数据安全方面实现自己所需的操作。同时,我们也可以通过这些代码,感受到黑客的精神和技术的魅力,找寻到自己更好的成长和发展机会。
linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 ,。。谢谢
源代码奉上,流程图。。。这个太简单了,你自己看看。。。。。。。
//TCP
//服务器端程序
#include< stdio.h >
#include< stdlib.h >
#include< windows.h >
#include< winsock.h >
#include< string.h >
#pragma comment( lib, "ws2_.lib" )
#define PORT
#define BACKLOG
#define TRUE 1
void main( void )
{
int iServerSock;
int iClientSock;
char *buf = "hello, world!\n";
struct sockaddr_in ServerAddr;
struct sockaddr_in ClientAddr;
int sin_size;
WSADATA WSAData;
if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化
{
printf( "initializationing error!\n" );
WSACleanup( );
exit( 0 );
}
if( ( iServerSock = socket( AF_INET, SOCK_STREAM, 0 ) ) == INVALID_SOCKET )
{
printf( "创建套接字失败!\n" );
WSACleanup( );
exit( 0 );
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( PORT );//监视的端口号
ServerAddr.sin_addr.s_addr = INADDR_ANY;//本地IP
memset( & ( ServerAddr.sin_zero ), 0, sizeof( ServerAddr.sin_zero ) );
if( bind( iServerSock, ( struct sockaddr * )&ServerAddr, sizeof( struct sockaddr ) ) == -1 )
{
printf( "bind调用失败!\n" );
WSACleanup( );
exit( 0 );
}
if( listen( iServerSock, BACKLOG ) == -1 )
{
printf( "listen调用失败!\n" );
WSACleanup( );
exit( 0 );
}
while( TRUE )
{
sin_size = sizeof( struct sockaddr_in );
iClientSock = accept( iServerSock, ( struct sockaddr * )&ClientAddr, &sin_size );
if( iClientSock == -1 )
{
printf( "accept调用失败!\n" );
WSACleanup( );
exit( 0 );
}
printf( "服务器连接到%s\n", inet_ntoa( ClientAddr.sin_addr ) );
if( send( iClientSock, buf, strlen( buf ), 0 ) == -1 )
{
printf( "send调用失败!" );
closesocket( iClientSock );
WSACleanup( );
exit( 0 );
}
}
}
/////客户端程序
#include< stdio.h >
#include< stdlib.h >
#include< windows.h >
#include< winsock.h >
#include< string.h >
#pragma comment( lib, "ws2_.lib" )
#define PORT
#define BACKLOG
#define TRUE 1
#define MAXDATASIZE
void main( void )
{
int iClientSock;
char buf[ MAXDATASIZE ];
struct sockaddr_in ServerAddr;
int numbytes;
// struct hostent *he;
WSADATA WSAData;
// int sin_size;
/* if( ( he = gethostbyname( "liuys" ) ) == NULL )
{
printf( "gethostbyname调用失败!" );
WSACleanup( );
exit( 0 );
}
*/
if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化
{
printf( "initializationing error!\n" );
WSACleanup( );
exit( 0 );
}
if( ( iClientSock = socket( AF_INET, SOCK_STREAM, 0 ) ) == INVALID_SOCKET )
{
printf( "创建套接字失败!\n" );
WSACleanup( );
exit( 0 );
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( PORT );
// ServerAddr.sin_addr = *( ( struct in_addr * )he->h_addr );
ServerAddr.sin_addr.s_addr = inet_addr( "..2." );//记得换IP
memset( &( ServerAddr.sin_zero ), 0, sizeof( ServerAddr.sin_zero ) );
if( connect( iClientSock, ( struct sockaddr * ) & ServerAddr, sizeof( struct sockaddr ) ) == -1 )
{
printf( "connect失败!" );
WSACleanup( );
exit( 0 );
}
numbytes = recv( iClientSock, buf, MAXDATASIZE, 0 );
if( numbytes == -1 )
{
printf( "recv失败!" );
WSACleanup( );
exit( 0 );
}
buf[ numbytes ] = '\0';
printf( "Received: %s", buf );
closesocket( iClientSock );
WSACleanup( );
}
/////UDP
//服务器
#include< stdio.h >
#include< string.h >
#include< winsock.h >
#include< windows.h >
#pragma comment( lib, "ws2_.lib" )
#define PORT
#define BACKLOG
#define TRUE 1
#define MAXDATASIZE
void main( void )
{
int iServerSock;
// int iClientSock;
int addr_len;
int numbytes;
char buf[ MAXDATASIZE ];
struct sockaddr_in ServerAddr;
struct sockaddr_in ClientAddr;
WSADATA WSAData;
if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )
{
printf( "initializationing error!\n" );
WSACleanup( );
exit( 0 );
}
iServerSock = socket( AF_INET, SOCK_DGRAM, 0 );
if( iServerSock == INVALID_SOCKET )
{
printf( "创建套接字失败!\n" );
WSACleanup( );
exit( 0 );
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( PORT );//监视的端口号
ServerAddr.sin_addr.s_addr = INADDR_ANY;//本地IP
memset( & ( ServerAddr.sin_zero ), 0, sizeof( ServerAddr.sin_zero ) );
if( bind( iServerSock, ( struct sockaddr * )&ServerAddr, sizeof( struct sockaddr ) ) == -1 )
{
printf( "bind调用失败!\n" );
WSACleanup( );
exit( 0 );
}
addr_len = sizeof( struct sockaddr );
numbytes = recvfrom( iServerSock, buf, MAXDATASIZE, 0, ( struct sockaddr * ) & ClientAddr, &addr_len );
if( numbytes == -1 )
{
printf( "recvfrom调用失败!\n" );
WSACleanup( );
exit( 0 );
}
printf( "got packet from %s\n", inet_ntoa( ClientAddr.sin_addr ) );
printf( "packet is %d bytes long\n", numbytes );
buf[ numbytes ] = '\0';
printf( "packet contains \"%s\"\n", buf );
closesocket( iServerSock );
WSACleanup( );
}
//客户端
#include< stdio.h >
#include< stdlib.h >
#include< windows.h >
#include< winsock.h >
#include< string.h >
#pragma comment( lib, "ws2_.lib" )
#define PORT
#define MAXDATASIZE
void main( void )
{
int iClientSock;
struct sockaddr_in ServerAddr;
int numbytes;
char buf[ MAXDATASIZE ] = { 0 };
WSADATA WSAData;
if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )
{
printf( "initializationing error!\n" );
WSACleanup( );
exit( 0 );
}
if( ( iClientSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == -1 )
{
printf( "创建套接字失败!\n" );
WSACleanup( );
exit( 0 );
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( PORT );
ServerAddr.sin_addr.s_addr = inet_addr( "..2." );//记得换IP
memset( &( ServerAddr.sin_zero ), 0, sizeof( ServerAddr.sin_zero ) );
numbytes = sendto( iClientSock, buf, strlen( buf ), 0, ( struct sockaddr * ) & ServerAddr, sizeof( struct sockaddr ) );
if( numbytes == -1 )
{
printf( "sendto调用失败!\n" );
WSACleanup( );
exit( 0 );
}
printf( "sent %d bytes to %s\n", numbytes, inet_ntoa( ServerAddr.sin_addr ) );
closesocket( iClientSock );
WSACleanup( );
}