前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言第1课——socket编程+c++,c语言语录

C语言第1课——socket编程+c++,c语言语录

作者头像
w4979的博客
发布2020-06-01 10:22:23
2.3K0
发布2020-06-01 10:22:23
举报
文章被收录于专栏:随笔记录
  1. TCP/IP协议

传输控制/网际协议,又叫网络通信协议。实际上,它包含上百个功能的协议,如ICMP(互联网控制信息协议)、FTP(文件传输协议)、UDP(用户数据包协议)、ARP(地址解析协议)等。TCP负责发现传输的问题,一旦有问题就会发出重传信号,直到所有数据安全正确的传输到目的地。

2.套接字(socket)

在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。socket其实是一种特殊的IO接口,也是一种文件描述符。

套接字分为三类:

流式socket(SOCK_STREAM):流式套接字提供可靠、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。

数据报socket(SOCK_DGRAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的保温进行传输,是无序的,并且不保证是可靠、无差错的。它使用的数据报协议是UDP。

原始socket:原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用复杂,主要用于一些协议的开发。

套接字由三个参数构成:IP地址,端口号,传输层协议。这三个参数用以区分不同应用程序进程间的网络通信与连接。

套接字的数据结构:C语言进行套接字编程时,常会使用到sockaddr数据类型和sockaddr_in数据类型,用于保存套接字信息。

代码语言:javascript
复制
struct sockaddr
{
 //地址族,2字节
 unsigned short sa_family;
 //存放地址和端口,14字节
 char sa_data[14];
 }
 struct sockaddr_in
 {
 //地址族
 short int sin_family;
 //端口号(使用网络字节序)
 unsigned short int sin_port;
 //地址
 struct in_addr sin_addr;
 //8字节数组,全为0,该字节数组的作用只是为了让两种数据结构大小相同而保留的空字节
 unsigned char sin_zero[8]
 }

对于sockaddr,大部分的情况下只是用于bind,connect,recvfrom,sendto等函数的参数,指明地址信息,在一般编程中,并不对此结构体直接操作。而用sockaddr_in来替。

两种数据结构中,地址族都占2个字节,

常见的地址族有:AF_INET,AF_INET6AF_LOCAL。

这里要注意字节序的问题,最好使用以下函数来对端口和地址进行处理:

  1. uint16_t htons(uint16_t host16bit) 把16位值从主机字节序转到网络字节序 uint32_t htonl(uint32_t host32bit) 把32位值从主机字节序转到网络字节序
  2. uint16_t ntohs(uint16_t net16bit) 把16位值从网络字节序转到主机字节序 uint32_t ntohs(uint32_t net32bit) 把32位值从网络字节序转到主机字节序

使用socket进行TCP通信时,经常使用的函数有:

3.下面给出server和client的两个例子

代码语言:javascript
复制
Client:
#include <stdio.h>
 #include <stdlib.h>
 #include <WinSock2.h>
 #pragma comment(lib,“ws2_32.lib”) //加载 ws2_32.dll
int main() {
 /**/
 //初始化DLL
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//向服务器发起请求
struct sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.s_addr= inet_addr("10.88.201.54");
sockAddr.sin_port = htons(8080);
connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
//接收服务器传回的数据
char szBuffer[MAXBYTE] = { 0 };
recv(sock, szBuffer, MAXBYTE, NULL);
//输出接收到的数据
printf("Message form server : %s\n", szBuffer);
//关闭套接字
closesocket(sock);

//终止使用 DLL
WSACleanup();
system("pause");
return 0;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/12/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档