Windows基于tcp的socket编程(课程代码基础上修改)

来源:互联网 发布:5轴激光切割编程软件 编辑:程序博客网 时间:2024/06/08 20:33
// tcpclient.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
/*该例程包含错误检查代码,主要用于描述创建TCP Client SOCKET并进行通讯的流程*/


#include <stdio.h>
#include <winsock2.h>


#pragma comment(lib, "ws2_32.lib")


int main(int argc, char *argv[])
{
//step 1: 初始化Windows Socket 2.2库
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (ret != 0)
{
printf("装载Winsock库出错\n");
WSACleanup();
return -1;
}


//step 2: 创建客户端SOCKET套接字
SOCKET sConnection = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sConnection) //无效套接字
{
printf("创建SOCKET套接字出错\n");
WSACleanup();
return -1;
}


//step 3: 设置服务器地址
sockaddr_in peer;
memset(&peer, 0, sizeof(sockaddr_in));
peer.sin_family = AF_INET;
peer.sin_addr.s_addr = inet_addr("192.168.1.101");
peer.sin_port = htons((u_short)atoi("5150"));


//step 4: 连接服务器
ret = connect(sConnection, (SOCKADDR *)&peer, sizeof(peer));
if (SOCKET_ERROR == ret)
{
printf("连接服务器出错\n");
closesocket(sConnection);
WSACleanup();
return -1;
}


char recvmsg[1024] = { 0 };
char sendmsg[1024] = { 0 };
int recvBytes = 0;
//step 5:与服务器进行通讯
while (true){
recvBytes = recv(sConnection, recvmsg, 1024, 0);
if (recvBytes > 0){
printf("%s\n", recvmsg);
recvBytes = 0;
}

while (true){
printf("please input your account(username+sercret+information) to register. \n");
scanf_s("%s", sendmsg, 1024);
if (strcmp(sendmsg, "quit") == 0){
send(sConnection, sendmsg, sizeof(sendmsg), 0);
break;
}

send(sConnection, sendmsg, sizeof(sendmsg), 0);
break;
}
if (strcmp(sendmsg, "quit") == 0) break;
}
printf("ending...");
//step 6:关闭套接字
closesocket(sConnection);


//step 7:释放Winsock库
WSACleanup();
getchar();
return 0;

}


// tcpserver.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#pragma comment(lib, "ws2_32.lib")


#include <stdio.h>
#include <winsock2.h>




int main(int argc, char *argv[])
{
//step1:初始化Windows Socket 2.2库
WSADATA              wsaData;
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (ret != 0)
{
printf("装载Winsock库出错\n");
WSACleanup();
return -1;
}


//step2:创建一个新的Socket来响应客户端的连接请求 
SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sListen)
{
printf("创建SOCKET套接字出错\n");
WSACleanup();
return -1;
}


//step3:填写服务器地址信息
int port = 5150;// 端口为5150
SOCKADDR_IN          local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr = htonl(INADDR_ANY);
//IP地址为INADDR_ANY,使用htonl将IP地址转换为网络格式


//step4:绑定监听端口 
if (SOCKET_ERROR == bind(sListen, (SOCKADDR *)&local, sizeof(local)))
{
printf("bind出错\n");
closesocket(sListen);
WSACleanup();
return -1;
}


//step5:开始监听,指定三次握手等待队列长度为5
if (SOCKET_ERROR == listen(sListen, 5))
{
printf("listen出错\n");
closesocket(sListen);
WSACleanup();
return -1;
}


printf("开始监听......\n");
char recvmsg[1024] = { 0 };
char sendmsg[] = "Welcome to Network Programing!";
int recvBytes = 0;
while (true)
{
//step6:接受新的连接
SOCKADDR_IN clientAddr;
memset(&clientAddr, 0, sizeof(clientAddr));
int clientAddrLen = sizeof(clientAddr);
SOCKET sConnection = accept(sListen,
(SOCKADDR *)&clientAddr, &clientAddrLen);
//step7:新的连接建立后,就可以互相通信了,
//在这个简单的例子中,
//我们发送"Welcome to Network Programing!",然后关闭连接
if (INVALID_SOCKET != sConnection)
{
printf("Connected from %s\n", inet_ntoa(clientAddr.sin_addr));
send(sConnection, sendmsg, sizeof(sendmsg), 0);
while (true){

char *name=NULL;
char *secret=NULL;
char *info=NULL;
char *strsv=NULL;


recvBytes = recv(sConnection, recvmsg, 1024, 0);
if (recvBytes > 0)
printf("%s\n", recvmsg);
if (strcmp(recvmsg,"quit")==0){//判断是否退出
break;
}
//解析客户端发送的信息
name=strtok_s(recvmsg,"+",&strsv);
secret = strtok_s(NULL, "+",&strsv);
info = strtok_s(NULL, "+",&strsv);
//判断数据格式是否符合格式
if (!name || !secret){
char sendmsg[] = "Please input infomation with the right format!\n";
send(sConnection, sendmsg, sizeof(sendmsg), 0);
continue;
}
//进行用户文件处理操作
// FILE *cfPtr=NULL;
FILE *cf;
char fname[64]="",fsecret[64]="",finfo[512]="";
if (!(cf=fopen("D:\\sfile.txt", "r+"))){
printf("Source file cannot be opened\n");
//exit(1);
}
//检查文件中是否有相同的用户名
while (!feof(cf)){
fscanf(cf,"%s%s%s",fname,fsecret,finfo);
if (strcmp(fname, name) == 0){
char sendmsg[] = "name has existed!\n";
send(sConnection, sendmsg, sizeof(sendmsg), 0);
break;
}
}
//将用户注册信息存放到用户文件中
//返回注册成功信息
if (feof(cf)){
fprintf_s(cf, "\n%s %s %s", name, secret, info);
char sendmsg[] = "register success!\n";
send(sConnection, sendmsg, sizeof(sendmsg), 0);
}
// fclose(cfPtr);
fclose(cf);
}
//关闭与客户通讯的套接字
printf("ending...\n");
closesocket(sConnection);
break;
}
}


//step8:关闭套接字
closesocket(sListen);
//step9:释放Windows Socket DLL的相关资源
WSACleanup();
return 0;
}





0 0
原创粉丝点击