C++ 如何使用 Socket 类向 HTTP 服务器发送数据和接收响应

C++ 如何使用 Socket 类向 HTTP 服务器发送数据和接收响应,第1张

Socket编程首先要包含所需的头文件Winsock2.h并工程中添加库文件ws2_32.lib.

接着加载套接字库所用函数是

WSAStartup( wVersionRequested, &wsaData )第一个参数代表的是所要加载的套接字库的版本,第二个参数用于存储返回的版本信息

wVersionRequested = MAKEWORD( 1, 1 )用MAKEWORD来设置版本号的值其中地位代表主版本号

TCP编程:

服务器端的编写:

1. 创建套接字

SOCKET socketSrc = socket(AF_INET, SOCK_STREAM, 0)

第一个参数:指定地址族在1.1版本中只能使用AF_INET

第二个参数:指定套接字的类型在1.1版本中指定指定两种一SOCK_STREAM流式套接字和SOCK_DREAM数据报套接字

第三个参数:指示所要使用的的协议,如果为0则自动选择合适的协议(推荐)

2. 绑定套接字

bind(socketSrc, (SOCKADDR*)&addsrc, sizeof(SOCKADDR))

第一个参数:一个未绑定的的套接字

第二个参数:通过一个SOCKADDR结构体将一个地址分配给套接字

第三个参数:第二个参数的大小长度

SOCKADDR结构体: struct sockaddr_in {

short sin_family

u_short sin_port

struct in_addr sin_addr

charsin_zero[8]

}

第一个成员:sin_family地址族(这个参数不使用网络字节序列,其他参数都是网络字节序列)

第二个成员:sin_port指定要绑定的端口使用htons来转换成网络字节序列因为是无符号短整型

第三个成员:in_addr的结构体用来存放地址in_addr的结构如下

struct in_addr {

union {

struct S_un_b

struct S_un_w

u_long S_addr

} S_un

}

可以看出in_addr是一个包含一个联合体的结构体,联合体可以用来存放不同类型的数据但只存放一个数据,根据选择不同而不同,我们的程序中选择的是长整型的变量S_addr来存放一个地址需用htonl来转换成为网络字节序;

l htonl和htons区别是在于一个是将一个32位的主机字节序列转换成32位的TCP/IP的网络字节序一个则是16位

l inet_addr的用处是将一个点分制的IP地址字符串转换为一个合适的 in_addr的变量。

l inet_ntoa将一个网络地址转换为标准的点分式地址格式的字符串

3. 监听套接字:

listen(socketSrc, 5)//listen用于将一个已绑定但未连接的套接字对象设定成监听模式等 到一个即将到来的连接

第二个参数:表示等待连接的最大长度,如果参数被设置为SOMAXCONN将被设成一个最大的可能值

4. 接受连接:

在一个被设置为监听的套接字上允许一个连接,并返回一个已连接的新的套接字

SOCKET socketconn = accept(socketSrc, (SOCKADDR*)&addclient, &len)

第一个参数:一个被设置为监听状态的套接字

第二个参数:一个SOCKADDR结构体用于保存请求连接的实体的地址,根据地址族的不同所创建的结构体不一样

第三个参数:存储地址的长度,此参数在调用accept函数前必须初始化,否则会导致调用失败

5. 完成以上工作后通过recv和send函数来接收和发送数据

recv(socketconn, recvbuf, 100, 0)

第一个参数是一个已连接的套接字

第二个参数是用来存储接收的数据的缓冲区地址

第三个参数表示缓冲区的大小

第四个参数指示接收的模式此处设为0

客户端的编写

6. 首先也是创建套接字

7. 然后在建立连接

connect(sockclient, (SOCKADDR*)&addsrc, sizeof(SOCKADDR))

第二个参数是要连接的地址,第三个参数则是地址的大小

UDP编程部分在简单的多线程聊天室的编写中详细说明

他是基于无连接的协议

所以编写服务器端时只要绑定了套接字后就可以开始传送和接受数据,而客户端则只需创建套接字就可以开始传送和接收

同过 recvfrom和sendto函数来操作

使用closesocket(m_socket)关闭一个套接字,使用WSACleanup()来释放套接字库

希望对你有帮助呵呵 这是在VC下的

VC访问WEB服务器?

哪个都一样,你需要了解HTTP协议,比如,让百度帮你搜索,你需要给百度的地址传参数

发送HTTP报表到百度的WEB服务器

str = "GET /s?wd=HTTP"

send(s, str, strlen(str), 0)

然后再recv返回数据,便是相当于你使用BAIDU搜索了。

登录邮箱这个,因为涉及到SESSION(实际是COOKIE)等验证,你自己还要实现COOKIE的传递,工作量多得多。

填写注册信息,原理也还是一样,你自己要向表单action的文件提交HTTP请求就可以了

MSDN:

.NET Framework 类库

Thread 类

创建并控制线程,设置其优先级并获取其状态。

命名空间:System.Threading

程序集:mscorlib(在 mscorlib.dll 中)

备注

一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。使用 ThreadStart 委托或 ParameterizedThreadStart 委托指定由线程执行的程序代码。使用 ParameterizedThreadStart 委托可以将数据传递到线程过程。

在线程存在期间,它总是处于由 ThreadState 定义的一个或多个状态中。可以为线程请求由 ThreadPriority 定义的调度优先级,但不能保证操作系统会接受该优先级。

GetHashCode 提供托管线程的标识。在线程的生存期内,无论获取该值的应用程序域如何,它都不会和任何来自其他线程的值冲突。

注意

操作系统 ThreadId 和托管线程没有固定关系,这是因为非托管宿主能控制托管与非托管线程之间的关系。特别是,复杂的宿主可以使用 CLR Hosting API 针对相同的操作系统线程调度很多托管线程,或者在不同的操作系统线程之间移动托管线程。

下面的代码示例说明简单的线程处理功能。

using System

using System.Threading

// Simple threading scenario: Start a static method running

// on a second thread.

public class ThreadExample {

// The ThreadProc method is called when the thread starts.

// It loops ten times, writing to the console and yielding

// the rest of its time slice each time, and then ends.

public static void ThreadProc() {

for (int i = 0i <10i++) {

Console.WriteLine("ThreadProc: {0}", i)

// Yield the rest of the time slice.

Thread.Sleep(0)

}

}

public static void Main() {

Console.WriteLine("Main thread: Start a second thread.")

// The constructor for the Thread class requires a ThreadStart

// delegate that represents the method to be executed on the

// thread. C# simplifies the creation of this delegate.

Thread t = new Thread(new ThreadStart(ThreadProc))

// Start ThreadProc. On a uniprocessor, the thread does not get

// any processor time until the main thread yields. Uncomment

// the Thread.Sleep that follows t.Start() to see the difference.

t.Start()

//Thread.Sleep(0)

for (int i = 0i <4i++) {

Console.WriteLine("Main thread: Do some work.")

Thread.Sleep(0)

}

Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.")

t.Join()

Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.")

Console.ReadLine()

}

}

此代码产生的输出类似如下内容:

Main thread: Start a second thread.

Main thread: Do some work.

ThreadProc: 0

Main thread: Do some work.

ThreadProc: 1

Main thread: Do some work.

ThreadProc: 2

Main thread: Do some work.

ThreadProc: 3

Main thread: Call Join(), to wait until ThreadProc ends.

ThreadProc: 4

ThreadProc: 5

ThreadProc: 6

ThreadProc: 7

ThreadProc: 8

ThreadProc: 9

Main thread: ThreadProc.Join has returned. Press Enter to end program.


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/231496.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存