最近由于做一个移动客户端的项目时需要用C语言的服务器,故而自己学习了一段时间的C++网络编程,有一些代码心得,大家分享一下。
服务器端用的是C++在VS下编译。代码比较生涩。小白一枚。勿喷。
// cTcpTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "WinSock2.h"
#include <iostream>
#pragma comment(lib,"Ws2_32.lib")//导入库,lib表示库," "表示库的名称
int _tmain(int argc, _TCHAR* argv[])
{
//加载WinSock库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
return 0;
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 0;
}
SOCKET listenfd;
SOCKADDR_IN AddrSer;
memset(&AddrSer,0,sizeof(AddrSer));
AddrSer.sin_family=AF_INET;
AddrSer.sin_port=htons(9000);
AddrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY表示接受任何机器的请求
listenfd=socket(AF_INET,SOCK_STREAM,0);
//绑定服务器地址
if(bind(listenfd,(SOCKADDR*)&AddrSer,sizeof(SOCKADDR))<0)
{
perror("bind");
return 0;
}
//启动监听,socket变为被动阶段
if(listen(listenfd,SOMAXCONN)<0)
{
perror("listen");
return 0;
}
SOCKADDR_IN perraddr;
int perrlen = sizeof(perraddr);
SOCKET conn;
//当有客户端接入时返回该socket
if(!(conn=accept(listenfd,(struct sockaddr*)&perraddr,&perrlen)))
{
perror("accept");
return 0;
}
char recvbuf[1024];
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
recv(conn,recvbuf,sizeof(recvbuf),0);
send(conn,recvbuf,sizeof(recvbuf),0);
}
closesocket(listenfd);
WSACleanup();
return 0;
return 0;
}
客户端由于用于android客户端的,所以测试的时候socketClient端就用了java代码。求谅解
package clientTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
public class SocketClientTestDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress address =InetAddress.getByName("www.baidu.com");
System.out.println(address.getHostAddress());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Socket socket = new Socket("127.0.0.1",9000);
System.out.println("已连接");
//从键盘读取一行数据给服务器
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
//写到服务器端---》服务器端进行读操作
//字节流---》一次写一行的流类
PrintWriter out =new PrintWriter(socket.getOutputStream(),true);
out.println(str);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str2 = in.readLine();
System.out.println(str);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}