socket编程中客户端常用函数 以及简单实现
1 常用函数
1.1 connect()
int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen);
客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。connect()成功返回0,出错返回-1,程序会阻塞。
1.2 bind():很少用
由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。
2 客户端的简单实现(C语言)
功能:连接到服务器后,如果服务器发送数据,则返回服务器发送的数据
unsigned char TcpRecvBuf[] /* 缓存区,完整的以太帧最大也就1520或1518字节,如果去掉协议部分则可以更小 */
static void Task_TCP_Client (void *pdata)
{
struct sockaddr_in server, client;
int sock, iState;
int statusOk = ; struct ip_addr stIpAddr;
IP4_ADDR(&stIpAddr, REMOTE_IP_0, REMOTE_IP_1, REMOTE_IP_2, REMOTE_IP_3);
server.sin_family = AF_INET; /* 服务器地址类型为IPV4 */
server.sin_port = htons(); /* 服务器的端口号为5000 */
server.sin_addr.s_addr = stIpAddr.addr; /* 服务器的IP地址 */
/*
* 以下4行为设置客户端的属性,可以不要,有系统自动分配端口号。即不调用bind函数。
*/
client.sin_family = AF_INET;
client.sin_port = htons( ); /* 设置客户端的端口 */
client.sin_addr.s_addr = htonl( INADDR_ANY );
bind( sock, (struct sockaddr *)&client, sizeof( client ) );/* 绑定本地接口 */
sock = socket( AF_INET, SOCK_STREAM, ); /* 使用TCP连接 */
/*
* 试图与服务器建立连接,阻塞程序
*/
iState = connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr));
while() {
statusOk = read(sock, TcpRecvBuf, sizeof(TcpRecvBuf));
if (statusOk > ) {
statusOk = write(sock, TcpRecvBuf,statusOk);
}
if (statusOk <= ){
iState = -;
while (iState == -) {
close( sock ); /* 关闭此连接 */
/*
* 下面将重新与服务器建立连接
*/
sock = socket( AF_INET, SOCK_STREAM, ); /* 使用TCP连接 */
bind( sock, (struct sockaddr *)&client, sizeof( client ) );/* 绑定本地接口 */
iState = connect(sock, (struct sockaddr *)&server, sizeof( server ));
OSTimeDly(); // 延迟一会儿,(ucos-ii的延迟函数,可以用其它延迟函数替代)
}
}
}
}
socket编程中客户端常用函数 以及简单实现的更多相关文章
- socket编程中客户端常用函数
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
- socket编程中服务器端常用函数 以及简单实现
1 常用函数 1.1 socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个 ...
- socket编程中write、read和send、recv之间的区别~转载
socket编程中write.read和send.recv之间的区别 http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- numpy函数库中一些常用函数的记录
##numpy函数库中一些常用函数的记录 最近才开始接触Python,python中为我们提供了大量的库,不太熟悉,因此在<机器学习实战>的学习中,对遇到的一些函数的用法进行记录. (1) ...
- perl编程中的map函数示例
转自:http://www.jbxue.com/article/14854.html 发布:脚本学堂/Perl 编辑:JB01 2013-12-20 10:20:01 [大 中 小] 本文介绍 ...
- Mysql中的常用函数:
Mysql中的常用函数: 1.字符串函数: (1).合并字符串 concat():// concat('M','y',"SQL",'5.5');== MySQL5.5//当传入的参 ...
- PHP socket 编程中的超时设置
PHP socket 编程中的超时设置.网上找了半天也没找到.贴出来分享之:设置$socket 发送超时1秒,接收超时3秒: $socket = socket_create(AF_INET,SOCK_ ...
- 【C/C++开发】多线程编程中的join函数
多线程编程中的join函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # coding: utf-8 # 测试多线程中join的 ...
随机推荐
- 数论 - 筛法暴力打表 --- hdu : 12876 Quite Good Numbers
Quite Good Numbers Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit ...
- c# 打开指定的网址
System.Diagnostics.Process.Start(url);
- char导致的验证异常
表的一个字段: Moblie char(15) 对应的mvc代码: @Html.EditorFor(c => c.Mobile) [RegularExpression("^1[3|4 ...
- easyui的window插件再次封装
easyui的window插件再次封装 说明:该插件弹出的弹出框在最顶层的页面中,而不是在当前页面所在的iframe中,它的可拖动范围是整个浏览器窗口:所以不能用JS的parent对象获取弹出它的父页 ...
- js带上框架和防止被iframe的代码
1.永远都会带着框架<script language="JavaScript"><!--if (window == top)top.location.href = ...
- 关于jq ajax封装以及error的报错参数
jq的ajax完整版本 $.ajax({ url: "GetCityByPId.ashx", data: {pId:pid}, dataType: "JSON" ...
- gitlab web hook
https://pypi.python.org/pypi/glhooks/0.1.0 https://filippo.io/a-python-github-push-webhook-handler/ ...
- 算法:冒泡排序(python版)
1.将n个元素从大到小排序后,选择第k个大的元素 #!/usr/bin/env python #coding -*- utf:8 -*- #冒泡排序选第k个元素 import random impor ...
- MYSQL 解锁与锁表
解锁 第一种 show processlist; 找到锁进程,kill id ; 第二种 mysql>UNLOCK TABLES; 锁表 锁定数据表,避免在备份过程中,表被更新 mysql> ...
- Python中类的定义
class Student(object): # 有点类似其它高级语言的构造函数 def __init__(self,name,score): self.name = name self.score ...