基于TCP的socket编程

服务器代码

服务器端代码如下

//TCPServer.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") #define PORT 8888 //端口号
#define BACKLOG 5 //最大监听数
char serverAddr[16] = "192.168.0.3";//服务器端IP
int main()
{
WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
/*
使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
*/
printf_s("WSAStartup失败.\n"); // 初始化失败
exit(1);
}
SOCKET socketFD = 0; //socket句柄
int recvLen = 0; //接收成功后的返回值
SOCKET newFD = 0; //建立连接后的句柄
char buf[4096] = { 0 }; //buff缓冲区
SOCKADDR_IN addrServer, addrClient; socketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
if (INVALID_SOCKET == socketFD)
{
printf_s("创建socket失败\n");
printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
return 0;
}
printf_s("创建socket成功\n");
addrServer.sin_family = AF_INET; /*该属性表示接收本机或其他机器传输*/
addrServer.sin_port = htons(PORT); /*端口号*/
addrServer.sin_addr.S_un.S_addr = inet_addr(serverAddr);/*服务器IP*/
//连接方法: 传入句柄,目标地址,和大小
if (0 > connect(socketFD, (SOCKADDR*)&addrServer, sizeof(addrServer)))
{
printf_s("连接服务器失败\n");
printf_s("CONNECT ERROR #%d\n", WSAGetLastError());
}
else {
printf("连接服务器成功\n");
recv(socketFD, buf, sizeof(buf), 0); ////将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。 
printf("Recv:%s\n", buf);
} return 0;
}

客户端代码

客户端代码如下

//TCPClient.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") #define PORT 8888 //端口号
#define BACKLOG 5 //最大监听数
char serverAddr[16] = "192.168.0.3";//服务器端IP
int main()
{
WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
/*
使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
*/
printf_s("WSAStartup失败.\n"); // 初始化失败
exit(1);
}
SOCKET socketFD = 0; //socket句柄
int recvLen = 0; //接收成功后的返回值
SOCKET newFD = 0; //建立连接后的句柄
char buf[4096] = { 0 }; //buff缓冲区
SOCKADDR_IN addrServer, addrClient; socketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
if (INVALID_SOCKET == socketFD)
{
printf_s("创建socket失败\n");
printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
return 0;
}
printf_s("创建socket成功\n");
addrServer.sin_family = AF_INET; /*该属性表示接收本机或其他机器传输*/
addrServer.sin_port = htons(PORT); /*端口号*/
addrServer.sin_addr.S_un.S_addr = inet_addr(serverAddr);/*服务器IP*/
//连接方法: 传入句柄,目标地址,和大小
if (0 > connect(socketFD, (SOCKADDR*)&addrServer, sizeof(addrServer)))
{
printf_s("连接服务器失败\n");
printf_s("CONNECT ERROR #%d\n", WSAGetLastError());
}
else {
printf("连接服务器成功\n");
recv(socketFD, buf, sizeof(buf), 0); ////将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。 
printf("Recv:%s\n", buf);
} return 0;
}

运行结果

服务器端

客户端

基于UDP的socket编程

服务器代码

//UDPServer.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") #define PORT 8888 //端口号
#define BACKLOG 5 //最大监听数 int main()
{
WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
/*
使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
*/
printf_s("WSAStartup失败.\n"); // 初始化失败
exit(1);
}
SOCKET socketFD = 0; //socket句柄
int bufLen = 0; //接收成功后的返回值
char buf[4096] = { 0 }; //buff缓冲区
int fromLen = sizeof(SOCKADDR);
SOCKADDR_IN addrServer, addrClient; socketFD = socket(AF_INET, SOCK_DGRAM, 0); //建立socket
if (INVALID_SOCKET == socketFD)
{
printf_s("创建socket失败\n");
printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
return 0;
}
printf_s("创建socket成功\n");
addrServer.sin_family = AF_INET; /*该属性表示接收本机或其他机器传输*/
addrServer.sin_port = htons(PORT); /*端口号*/
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); /*IP,括号内容表示本机IP*/ //绑定地址结构体和socket
if (bind(socketFD, (SOCKADDR*)&addrServer, sizeof(addrServer)))
{
printf_s("绑定失败\n");
printf_s("BIND ERROR #%d\n", WSAGetLastError());
return 0;
}
printf_s("绑定端口%d成功\n", PORT); while (true) {
bufLen = recvfrom(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrClient, &fromLen);
if (bufLen < 0) {
printf_s("RECV ERROR#%d\n", WSAGetLastError());
continue;
}
printf_s("收到来自客户端[%s:%d]的数据报:%s",inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port),buf);
char send[] = { "服务器接收到客户数据报,这是返回信息" };
memcpy_s(buf, sizeof(buf), send, sizeof(send));
bufLen = sendto(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrClient, sizeof(addrClient));
if (bufLen < 0) {
printf_s("SEND ERROR#%d\n", WSAGetLastError());
continue;
}
}
closesocket(socketFD);
WSACleanup();
return 0;
}

客户端代码

//UDPClient.c
#include <stdio.h>
#include <string.h>
#include "winsock.h"
#include "windows.h"
#pragma comment(lib, "wsock32") #define PORT 8888 //端口号
#define BACKLOG 5 //最大监听数
char serverAddr[16] = "192.168.0.3";
int main()
{
WSADATA wsaData;/*WSADATA 结构被用来保存函数 WSAStartup 返回的 Windows Sockets 初始化信息*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
/*
使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数, 当一个应用程序调用 WSAStartup 函数时,
操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,
然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。
*/
printf_s("WSAStartup失败.\n"); // 初始化失败
exit(1);
}
SOCKET socketFD = 0; //socket句柄
int bufLen = 0; //接收成功后的返回值
char buf[4096] = { 0 }; //buff缓冲区
int fromLen = sizeof(SOCKADDR);
SOCKADDR_IN addrServer, addrClient; socketFD = socket(AF_INET, SOCK_DGRAM, 0); //建立socket
if (INVALID_SOCKET == socketFD)
{
printf_s("创建socket失败\n");
printf_s("SOCKET ERROR #%d\n", WSAGetLastError());
return 0;
}
printf_s("创建socket成功\n");
addrServer.sin_family = AF_INET; /*该属性表示接收本机或其他机器传输*/
addrServer.sin_port = htons(PORT); /*端口号*/
addrServer.sin_addr.S_un.S_addr = inet_addr(serverAddr); /*IP,括号内容表示本机IP*/
char send[] = "这里是客户端,发送信息给服务器";
memcpy_s(buf, sizeof(buf), send, sizeof(send));
bufLen = sendto(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrServer, sizeof(addrServer));
if (bufLen < 0) {
printf_s("SEND ERROR#%d\n", WSAGetLastError());
return 0;
}
bufLen= recvfrom(socketFD, buf, sizeof(buf), 0, (SOCKADDR*)&addrClient, &fromLen);
if (bufLen < 0) {
printf_s("RECV ERROR#%d\n", WSAGetLastError());
return 0;
}
printf_s("收到来自服务器[%s:%d]的数据报:%s", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port), buf);
closesocket(socketFD);
WSACleanup();
return 0;
}

运行结果

服务器端



客户端

C++/C socket编程实例的更多相关文章

  1. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  2. 【转】netlink socket编程实例

    [转]netlink socket编程实例 转自:http://blog.chinaunix.net/uid-14753126-id-2983915.html 关于Netlink IPC方式的介绍,请 ...

  3. NIO Socket编程实例

    1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO; import java.io.BufferedReader; ...

  4. TCP/UDP套接字 java socket编程实例

    网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ...

  5. [转] - linux下socket编程实例

    一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...

  6. Java NIO Socket编程实例

    各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用 ...

  7. java socket编程实例代码

    1.所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 两性话题 两性 ...

  8. 网络编程之socket编程实例

    简单实例1 server.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include ...

  9. Linux下的C++ socket编程实例

    阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...

随机推荐

  1. Jmeter(十七) - 从入门到精通 - JMeter后置处理器 -上篇(详解教程)

    1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...

  2. Ethical Hacking - Web Penetration Testing(10)

    SQL INJECTION SQLMAP Tool designed to exploit SQL injections. Works with many DB types, MySQL, MSSQL ...

  3. HDU - 1520 Anniversary party (树的最大独立集)

    Time limit :1000 ms :Memory limit :32768 kB: OS :Windows There is going to be a party to celebrate t ...

  4. 在Spring Bean的生命周期中各方法的执行顺序

    Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种: 通过实现 InitializingBe ...

  5. AndroidStudio查找硬编码的String字符串

    在Menu的“Analyze”中,选择“Run Inspection By Name”,然后输入“Hardcoded strings”,执行后,可以找到所有没有加入strings.xml的字符串. 按 ...

  6. vue学习(一)初步了解 vue实例

    //html:<div id="app"> <p>{{msg}}<p></div> //script 需要引入jar包vue-2.4 ...

  7. PHP设计模式之----观察者模式

    一.概述 1.观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新. 2.场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后 ...

  8. Django学习路6_修改数据库为 mysql ,创建mysql及进行迁徙

    在项目的 settings 中修改 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os. ...

  9. PHP fgetc() 函数

    定义和用法 fgetc() 函数从打开的文件中返回一个单一的字符. 语法 fgetc(file) 参数 描述 file 必需.规定要检查的文件. 提示和注释 注释:该函数处理大文件非常缓慢,所以它不用 ...

  10. PHP strval() 函数

    strval() 函数用于获取变量的字符串值.高佣联盟 www.cgewang.com PHP 版本要求: PHP 4, PHP 5, PHP 7 语法 string strval ( mixed $ ...