Socket编程基础——面向连接TCP

WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口。WinSock包含两个主要版本,即WinSock1和WinSock2,在vs2010环境下,通常使用WinSock 2.2实现网络通信的功能。

1、Socket接口启动
需要引入头文件winsock2.h及库文件ws2_32.lib

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
    cout<<"Init error"<<endl;
    return -1;
}

WSAStartup函数原型如下:
int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData)
(1)wVersionRequested:Socket接口版本号,例如2.2版本(MAKEWORD(2,2)),高位字节存储副版本号,低位字节存储主版本号;
(2)lpWSAData:指向WSADATA结构体的指针,WSADATA结构体返回Socket信息;
如果上面函数执行成功,则返回0,否则可以通过WSAGetLastError()查看错误代码。例如:WSAEINVAL表示指定的Windows Socket版本不被该DLL支持。

2、IP地址的表示形式
对普通用户而言,IP地址使用点分法表示("192,168.0.1"字符串),但在计算机中不会使用这种方式,因为这样会浪费存储空间。实际上,计算机使用长整型存储IP地址,分为网络字节序和主机字节序。
(1)网络字节序
在网络传输过程中,IP地址保存为32位二进制,TCP/IP规定,在低位存储地址中保存数据的高位字节,这种存储顺序称为网络字节顺序,所以数据的传输由高位至低位进行的。不同网络设备和操作系统在发送数据之前都需要将二进制数据转为网络字节序。
(2)IP地址结构体
通用结构

struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};

常用结构

struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};

struct in_addr就是32位IP地址。

struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr  S_un.S_addr
};

使用inet_addrinet_ntoa这两个函数可以实现点分IP地址字符串和网络字节序IP地址之间的转换。
unsigned long inet_addr(const char *cp):点分字符串->s_addr
char FAR * inet_ntoa(struct in_addr in)in_addr(sin_addr)->点分字符串

(3)主机字节序
可以使用htonl(),htons(),ntohl(),ntohs()这四个函数来实现主机字节顺序和网络字节顺序的转换。

3、服务器端通信流程
(1)创建服务器套接字

server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

指定IP地址族、SOCKET类型,协议,返回SOCKET

(2)绑定本地端口、IP

sockaddr_in sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port=htons(9000);
sAddr.sin_addr.S_un.S_addr=htonl(ADDR_ANY);
bind(server,(sockaddr*)&sAddr,sizeof(sAddr));

(3)监听等待连接

listen(server,5);

(4)接收连接,返回Socket

sockaddr_in cAddr;
int len=sizeof(cAddr);
client=accept(server,(sockaddr*)&cAddr,&len);

(5)接收数据

ZeroMemory(buf,BUF_SIZE);
recv(client,buf,BUF_SIZE,0);

buf为缓冲区,BUF_SIZE是缓冲区的大小;ZeroMemory函数将缓冲区置0,替代memset函数。

(6)发送数据
send(client,buf,strlen(buf),0);
在接收过程中接收大小写成缓冲区大小,发送时写成发送的数据大小!

4、客户端通信流程
(1)创建客户端套接字

client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

(2)连接服务器

cAddr.sin_port=htons(9000);
cAddr.sin_family=AF_INET;
cAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
retVal=connect(client,(sockaddr*)&cAddr,sizeof(cAddr));

(3)发送数据/接收数据
同服务器端

5、清理
(1)shutdown禁止制定的Socket上发送和接收数据
int shutdown(SOCKET s,int how)
参数s表示要关闭的Socket,当参数how被设置为SD_RECEIVE时,不允许再次调用recv接收数据,设置为SD_SEND时,不允许再次调用send发送数据,设置为SD_BOTH时,不允许发送和接受数据。
(2)closesocket
(3)WSACleanup

 

时间: 2024-12-20 19:49:49

Socket编程基础——面向连接TCP的相关文章

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

socket编程基础2

包含头文件<sys/socket.h> 功能:创建一个套接字用于通信 原型 int socket(int domain, int type, int protocol); 参数 domain :指定通信协议族(protocol family) type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW protocol :协议类型 返回值:成功返回非负整数, 它与文件描述符类似,我们把它称为套接口描述字,简称套接字.失败返回-

c#socket编程基础 [转帖]

c#socket编程基础 Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序..Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Int

socket编程基础3

服务器端尽可能使用RUSEADDR. 在绑定之前尽可能调用setsockopt来设置SO_REUSEADDR套接字选项. 使用SO_REUSEADDR选项可以使得不必等待TIME_WAIT状态消失就可以重启服务器. fork()产生一个进程来处理客户端与服务器端之间的消息.父进程保持监听状态连接.accept返回多个已连接套接字! echocli.c #include <unistd.h> #include <sys/types.h> #include <sys/socket

Windows下C语言的Socket编程例子(TCP和UDP)

一.  <TCP> server端: 1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char* argv[]) 8 { 9 //初始化WSA 10 WORD sockVersion = MAKEWORD(2,2); 11 W

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

java socket编程基础(转)

一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

Java从零开始学四十五(Socket编程基础)

一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

Java Socket编程基础篇

原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术.下面就让我们一起揭开Socket的神秘面纱. Socket编程 网络基础知识点: 两台计算机间进行通讯需要以下三个条件 IP地址.协议.端口号: IP地址:定位应用所在机器的网络位置.(比如家庭住址:北京市朝阳区XX街道XX小区) 端口号