socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程采用的都是流式套接字。

服务端socket编程步骤:

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、绑定套接字到一个IP地址和一个端口上(bind());

3、将套接字设置为监听模式等待请求(listen());

4、请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept());

5、用返回的套接字和客户端通信(send()/recv());

6、返回,等待另一连接请求;

7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

客户端socket编程步骤:

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、向服务端发送连接请求(connect());

3、和服务端进行通信(send()/recv());

4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

第一式: 加载/释放Winsock库:

1.加载方法:

WSADATA wsa;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
    return;   //代表失败
}

2.释放方法:

WSACleanup();

第二式: 构造SOCKET:

1.服务端:构造监听SOCKET,流式SOCKET.
   SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)

2.客户端:构造通讯SOCKET,流式SOCKET.
SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

第三式:配置监听地址和端口:

1.服务端: SOCKADDR_IN serverAddr
ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_port = htons(1234);           /*本地监听端口:1234*/
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/

第四式:   绑定SOCKET:

1.服务端:绑定监听SOCKET.
  bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

第五式: 服务端/客户端连接:

1.服务端:等待客户端接入.
   SOCKET Command_Sock = accept(Listen_Sock, ...)

2.客户端:请求与服务端连接.
int ret = connect(Client_Sock, ...)

第六式: 收/发数据:

1.服务端:等待客户端接入.char buf[1024].
    接收数据:recv(Command_Sock,buf, ...)

    发送数据:send(Command_Sock,buf, ...)

2.客户端:请求与服务端连接.char buf[1024].
    发送数据:send(Client_Sock,buf, ...)

    接收数据:recv(Client_Sock,buf, ...)

第七式: 关闭SOCKET:

1.服务端:关闭SOCKET.
   closesocket(Listen_Sock)
closesocket(Command_Sock)

2.客户端:关闭SOCKET.
closesocket(Client_Sock)

server端:

 #include "stdafx.h"
#include <stdio.h>
#include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[])
{
//初始化WSA(Windows Sockets API)
WORD sockVersion = MAKEWORD(, ); //高8位设置2,低8位设置2
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != ) //sockVersion是一个int型变量
{
return ;
} //创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //socket(int family, int type, int protocol)
if (slisten == INVALID_SOCKET)
{
printf("socket error !");
return ;
} //绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET; //协议域
sin.sin_port = htons(); //端口
sin.sin_addr.S_un.S_addr = INADDR_ANY; //协议地址
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //bind(SOCKET sock, const struct sockaddr *addr)
{
printf("bind error !");
} //开始监听
if (listen(slisten, ) == SOCKET_ERROR)
{
printf("listen error !");
return ;
} //循环接收数据
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
char revData[];
while (true)
{
printf("等待连接...\n");
sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
if (sClient == INVALID_SOCKET)
{
printf("accept error !");
continue;
}
printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); //接收数据
int ret = recv(sClient, revData, , );
if (ret > )
{
revData[ret] = 0x00;
printf(revData);
} //发送数据
char * sendData = "你好,TCP客户端!\n";
send(sClient, sendData, strlen(sendData), );
closesocket(sClient);
} closesocket(slisten);
WSACleanup();
return ;
}

client端:

 #include "stdafx.h"
#include <WINSOCK2.H>
#include <STDIO.H> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(,);
WSADATA data;
if(WSAStartup(sockVersion, &data) != )
{
return ;
} SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sclient == INVALID_SOCKET)
{
printf("invalid socket !");
return ;
} sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons();
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("connect error !");
closesocket(sclient);
return ;
}
char * sendData = "你好,TCP服务端,我是客户端!\n";
send(sclient, sendData, strlen(sendData), ); char recData[];
int ret = recv(sclient, recData, , );
if(ret > )
{
recData[ret] = 0x00;
printf(recData);
}
closesocket(sclient);
WSACleanup();
return ;
}

socket编程学习step1的更多相关文章

  1. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  2. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  3. Socket编程学习之道:揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1.         什么是TCP/IP.UDP? 2.         S ...

  4. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  5. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  6. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  7. C++的socket编程学习

    前言 不得不承认作为一个前端开发,仍有一个后台开发的梦.从socket通信开始学习,在工作之余补充学习点相关知识,记录下学习的过程. 服务端 服务器代码如下,在设置listen之后,通过accept获 ...

  8. BSD socket编程学习

    1.socket简介 BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口. 网络层IP提供点到点服务(IP地址标识),传输层TCP和UD ...

  9. socket编程学习

    socket: 也称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求. 常用的套接字API函数: 1.socket(): 函数原型为:int socket(int domain, int ...

随机推荐

  1. web 开发入门

    一 :进入Web JAVASE:标准 - standard    JAVA 桌面程序 GUI   SOCKET JAVAEE:企业-浏览器控制   WEB 二:软件结构:      c/s :clie ...

  2. 377. Combination Sum IV

    问题 Given an integer array with all positive numbers and no duplicates, find the number of possible c ...

  3. JS中定义对象原型的两种使用方法

    第一种: function Person() { this.username = new Array(); this.password = "123"; } Person.prot ...

  4. jquery计算文本字符个数

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. 51nod1134(最长递增子序列)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 题意: 中文题诶~ 思路: 直接暴力的话时间复杂度为 ...

  6. 【转】理解 PHP 依赖注入 | Laravel IoC容器

    Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,减少初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据 ...

  7. glassfish配置

    最近刚接触glassfish,在此记录一些glassfish的使用. 1.下载完glassfish之后(在配置玩JAVA路径后),解压缩.找到glassfish目录下的bin文件夹,运行asadmin ...

  8. 【NodeJS】环境变量配置

    安装完Node后,NodeJS自带npm.于是我照着网上的教程想搭一个脚手架.结果报错: ’node’ 不是内部或外部命令,也不是可运行的程序 但是我检查了一下系统环境变量,path底下有正确引用no ...

  9. 【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】

    之前说过,如果一个数据库中要存储的数据量整体比较小,但是其中一个表存储的数据比较多,比如日志表,这时候就要考虑分表存储了:但是如果一个数据库整体存储的容量就比较大,该怎么办呢?这时候就需要考虑分库了, ...

  10. 安装.NET FRAMEWORK 4.5安装进度条回滚之后发生严重错误 代码0x80070643

    安装.NET FRAMEWORK 4.5安装进度条回滚之后发生严重错误  代码0x80070643 注意: 回滚完成后,不要急着点击完成 查看日志:用IE浏览器打开,最后红色部分就是要查看的部分,本人 ...