转自:
http://blog.csdn.net/yaneng/article/details/4457685
套接字地址结构
(1)sockaddr结构:
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
sa_family 为网络地址类型,一般为AF_INET,表示该socket在Internet域中进行通信,该地址结构随选择的协议的不同而变化,因此一般情况下另一个 与该地址结构大小相同的sockaddr_in结构更为常用,sockaddr_in结构用来标识TCP/IP协议下的地址。换句话说,这个结构是通用 socket地址结构,而下面的sockaddr_in是专门针对Internet域的socket地址结构。
(2)sockaddr_in结构
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin _family为网络地址类型,必须设定为AF_INET。sin_port为服务端口,注意不要使用已固定的服务端口,如HTTP的端口80等。如果端口设置为0,则系统会自动分配一个唯一端口。sin_addr为一个unsigned long的IP地址。sin_zero为填充字段,纯粹用来保证结构的大小。
常见TCP/IP协议的定义:
#define IPPROTO_IP 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_RAW 255
INADDR_ANY
INADDR_ANY 0.0.0.0 做为动态IP用,建立后会被外部ip替换绑定此地址,不论哪个网段上的客户程序都能与该服务器通信。假设服务器的IP为192.168.1.1,那么如果服务器以INADDR_ANY开启,客户端以127.0.0.1或者192.168.1.1 connnect服务器都会成功。否则如果服务器以127.0.0.1或者192.168.1.1开启,客户端也必须用相同的地址连接
以下转载自:
http://blog.csdn.net/yaneng/article/details/5515500
1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用
closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
程序的性能:
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
BOOL bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));
8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可
以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的
作用,在阻塞的函数调用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));
分享到:
相关推荐
首先,WinSock学习笔记(一)可能涵盖了以下内容: 1. **Winsock初始化**:介绍如何使用`WSAStartup`函数来初始化WinSock库,并在完成工作后调用`WSACleanup`进行清理。 2. **套接字创建**:讲解`socket`函数的...
《C语言WinSock学习笔记》深入解析 一、WinSock简介与C语言结合的重要性 WinSock,即Windows Socket,是Microsoft在Windows操作系统上实现的网络编程接口,它为应用程序提供了访问底层TCP/IP协议栈的能力。在C语言...
Socket(套接字) ◆先看定义: typedef unsigned int u_int; typedef u_int SOCKET; ◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。...
《Visual C++ 程序设计学习笔记1~12章源代码》涵盖了广泛的编程概念和技术,这是一份深入理解Microsoft Visual C++编程环境的宝贵资料。这份笔记不仅包括了基础的C++语法和编程技巧,还涉及了高级主题,如多线程、...
### 基于Visual C++ 的 Winsock API 研究 #### 1. 概述 在现代软件开发中,网络编程占据了重要的位置。**Winsock** 是一种用于 Windows 系统上的网络编程接口,它允许开发人员利用 **TCP/IP** 协议栈创建网络应用...
**Windows TCP 通信学习笔记** 在Windows操作系统中,TCP(Transmission Control Protocol)通信是网络编程的基础,用于在不同计算机之间建立可靠的数据传输通道。本文主要围绕Windows下的Winsock API进行探讨,该...
### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...
《Delphi网友学习笔记》是一份详实的编程学习资源,专为对Delphi感兴趣的开发者设计。Delphi,由Borland公司开发,现由Embarcadero Technologies维护,是一款强大的Windows应用程序开发工具,以其高效的编译器和直观...
这个“win32编程学习笔记”可能包含了关于如何构建、理解和调试Win32应用程序的基础知识和高级概念。 在Win32编程中,开发者需要了解以下关键知识点: 1. **Windows API**:这是Win32编程的核心,提供了大量的函数...
《Visual C++/MFC学习笔记》是一份深入探讨C++和Microsoft Foundation Class (MFC)库的文档,旨在帮助读者掌握使用Visual C++开发Windows应用程序的技能。这份笔记主要分为六个章节,覆盖了从入门到高级的多个主题。...
这篇学习笔记是作者对书中的关键知识点进行整理和提炼的结果,旨在帮助读者更好地掌握和运用VC++。 笔记主要围绕以下几个核心主题展开: 1. **编译器和链接器基础**:了解VC++的编译过程,包括预处理、编译、汇编...
【VC学习笔记及项目代码1】是一份涵盖了多个VC++编程关键领域的学习资源,包括了Win32 API、MFC(面向对象的)框架、COM(Component Object Model,组件对象模型)及其ATL(Active Template Library,活动模板库)...
### VC++深入详解学习笔记知识点概述 #### 一、Windows程序运行原理及程序编写流程 - **窗口产生过程**:Windows程序的核心在于窗口的管理和消息处理。窗口是应用程序与用户交互的基本单位,它包含了客户区(用户...
在Windows操作系统中,开发Socket应用程序通常依赖于WinSock(Windows Socket)API。 WinSock API提供了多种类型的Socket,以适应不同的网络通信需求。主要有以下三种: 1. **流式套接字 (SOCK_STREAM)**:这种...
《深入探索MFC与Windows32编程》 MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于简化Windows应用程序开发。...通过深入学习这两方面的知识,开发者可以构建出功能丰富、性能优异的应用程序。
如果`WSAStartup()`函数执行成功,`wsaData`结构体将被填充,可以检查其中的`wVersion`字段来验证是否成功加载了正确的Winsock版本。 #### 三、创建Socket 创建socket是建立网络通信的基础,通过`socket()`函数...