阻塞式socket例子学习
/*************************************************************************
> File Name: Win_Server.c
> Author: SongLee
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h> #define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32") int main()
{
// 声明并初始化一个服务端(本地)的地址结构
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT); // 初始化socket dll
WSADATA wsaData;
WORD socketVersion = MAKEWORD(, );
if(WSAStartup(socketVersion, &wsaData) != )
{
printf("Init socket dll error!");
exit();
} // 创建socket
SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, );
if (SOCKET_ERROR == m_Socket)
{
printf("Create Socket Error!");
exit();
} //绑定socket和服务端(本地)地址
if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
{
printf("Server Bind Failed: %d", WSAGetLastError());
exit();
} //监听
if (SOCKET_ERROR == listen(m_Socket, )) //m_Socket监听套接字,专门负责客户端的监听
{
printf("Server Listen Failed: %d", WSAGetLastError());
exit();
} while()
{
printf("Listening To Client...\n"); sockaddr_in client_addr;
int client_addr_len = sizeof(client_addr); SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len); //m_New_Socket创建的与客户端通信的socket,后面与客户端通信就依靠这个套接字
if (SOCKET_ERROR == m_New_Socket)
{
printf("Server Accept Failed: %d", WSAGetLastError());
break;
} char buffer[BUFFER_SIZE];
memset(buffer, , BUFFER_SIZE);
if (recv(m_New_Socket, buffer, BUFFER_SIZE, ) < ) //接收数据是从m_New_Socket
{
printf("Server Receive Data Failed!");
break;
} char file_name[FILE_NAME_MAX_SIZE+];
memset(file_name, , FILE_NAME_MAX_SIZE+);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n", file_name); FILE * fp = fopen(file_name, "rb"); //windows下是"rb",表示打开一个只读的二进制文件
if (NULL == fp)
{
printf("File: %s Not Found\n", file_name);
}
else
{
memset(buffer, , BUFFER_SIZE);
int length = ; while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > )
{
if (send(m_New_Socket, buffer, length, ) < )
{
printf("Send File: %s Failed\n", file_name);
break;
}
memset(buffer, , BUFFER_SIZE);
} fclose(fp);
printf("File: %s Transfer Successful!\n", file_name);
}
closesocket(m_New_Socket);
} closesocket(m_Socket);
//释放winsock库
WSACleanup();
return ;
}
client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h> #define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32")
int main()
{
//初始化socket dll
WSADATA wsaData;
WORD socketVersion = MAKEWORD(, );
if (WSAStartup(socketVersion, &wsaData) != )
{
printf("Init socket dll error!");
exit();
} //创建socket
SOCKET c_socket = socket(AF_INET, SOCK_STREAM, );
if (SOCKET_ERROR == c_socket)
{
printf("Create Socket Error!");
system("pause");
exit();
} //指定服务器地址
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(PORT); if (SOCKET_ERROR == connect(c_socket, (LPSOCKADDR)&server_addr, sizeof server_addr))//此时系统为c_socket分配一个尚未使用的本地端口
{
printf("Can Not Connect To Server IP!\n");
system("pause");
exit();
} //输入文件名
char file_name[FILE_NAME_MAX_SIZE+] = {};
printf("Please Input File Name On Server: ");
scanf("%s", &file_name); char buffer[BUFFER_SIZE];
memset(buffer, , BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE:strlen(file_name)); //向服务器发送文件名
if (send(c_socket, buffer, BUFFER_SIZE, ) < )
{
printf("Send File Name Failed\n");
system("pause");
exit();
} FILE* fp = fopen(file_name, "wb");
if (NULL == fp)
{
printf("File: %s Can Not Open To Write\n", file_name);
system("pause");
exit();
}
else{
memset(buffer, , BUFFER_SIZE);
int length = ;
while ((length = recv(c_socket, buffer, BUFFER_SIZE, )) > )
{
if (fwrite(buffer, sizeof(char), length, fp) < length)
{
printf("File: %s Write Failed\n", file_name);
break;
}
memset(buffer, , BUFFER_SIZE);
}
printf("Receive File: %s From Server Successful!\n", file_name);
}
fclose(fp);
closesocket(c_socket); //释放winsock库
WSACleanup(); system("pause");
return ;
}
阻塞式socket例子学习的更多相关文章
- 非阻塞式socket的select()用法
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只 是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程 ...
- JAVA NIO学习三:NIO 的非阻塞式网络通信
紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...
- JAVA NIO学习记录2-非阻塞式网络通信
一.阻塞与非阻塞 传统的IO 流都是阻塞式的.也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信 ...
- Java IO(3)非阻塞式输入输出(NIO)
在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...
- 阻塞式和非阻塞式IO
有很多人把阻塞认为是同步,把非阻塞认为是异步:个人认为这样是不准确的,当然从思想上可以这样类比,但方式是完全不同的,下面说说在JAVA里面阻塞IO和非阻塞IO的区别 在JDK1.4中引入了一个NIO的 ...
- Java IO(2)阻塞式输入输出(BIO)的字节流与字符流
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- Java IO(2)阻塞式输入输出(BIO)
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- 为什么IO多路复用需要采用非阻塞式IO
近段时间开始学习<Unix网络编程>,代码实现了一个简单的IO多路复用+阻塞式的服务端,在学习了非阻塞式IO后,有一个疑问,即: 假如调用了select,并且关注了几个描述字,当关注的描述 ...
- socket编程学习step1
socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768 sockets(套接字)编程有三种,流式套接字(SOCK_ST ...
随机推荐
- 41-tr 简明笔记
替换指定的字符 tr [options] string1 string2 参数 tr通常带有两个参数:string1 和 string2 ,当tr发现与string1中有匹配的字符时,它将使用stri ...
- 使用while循环输入 1 2 3 4 5 6 8 9 10
n = 1 while n<11: if n==7: pass else: print(n) n = n +1
- kkt
- git将本地代码 和服务器git@osc 上的代码 关联
将本地代码 和服务器git@osc 上的代码 关联 要使用git 首先,你得安装一个git 下载 http://git-scm.com/downloads 安装完成后,需要简单的配置一下,打开 Git ...
- JS 打印功能代码可实现打印预览、打印设置等
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...
- BuiltWith
BuiltWith网站技术信息查询工具 利用该网站所提供的功能,你可以查询出某网站背后是由哪些技术来支持的, 比如操作系统的类型.所采用的访问量统计服务.采用的发布平台.广告平台.语言框架.聚合功能. ...
- Android中对内存和外存的读写
首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. public ...
- centos 开启VNC
安装软件包(有yum源安装的,不采用源码安装) yum -y install vnc vnc-server 安装成功后,配置如下: [root@localhost ~]# vncserver #设置 ...
- Java反射的一些理解
1.Class对象 VS. 实例对象 在Java中我们一般是这样使用类的:编写类,然后new对象,再调用方法.这里new出来的对象暂且称之为实例对象(instance).其实在这之前还涉及到一个Cla ...
- hdfs创建级联文件夹
一个文件夹 hdfs dfs -mkdir /out /一定要有 级联 hdfs dfs -mkdir -p /out/ags 需要家-p