用C#写服务器,C写客户端的SOCKET通信
// 我的客户端.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define DEFAULT_COUNT 1
#define DEFAULT_PORT 5150
#define DEFAULT_BUFFER 256
#define SLEEP_TIME 5*1000
int iPort = DEFAULT_PORT;
DWORD dwCount = DEFAULT_COUNT;
BOOL bRevOnly = FALSE;
using namespace std;
int client_operate(char szServer[128],BYTE szMessage[],int n)
{
WSADATA wsd;
SOCKET sClient;
char szBuffer[DEFAULT_BUFFER];
int ret;
memset(szBuffer,0,DEFAULT_BUFFER);
struct sockaddr_in server;
struct hostent *host = NULL;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Failed to load Winsock library!\n");
return 1;
}
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
printf("socket() failed: %d\n", WSAGetLastError());
return 1;
}
server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr(szServer);
if (server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname(szServer);
if (host == NULL)
{
printf("Unable to resolve server: %s\n", szServer);
return 1;
}
CopyMemory(&server.sin_addr, host->h_addr_list[0],
host->h_length);
}
if (connect(sClient, (struct sockaddr *)&server,
sizeof(server)) == SOCKET_ERROR)
{
printf("connect() failed: %d\n", WSAGetLastError());
return 1;
}
// Send and receive data
//
if (!bRevOnly)
{
ret = send(sClient, (char *)szMessage, n, 0);
if (ret == 0)
return 0;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n", WSAGetLastError());
return 0;
}
printf("Send %d bytes\n", ret);
}
if (ret == 0)
return 0;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
return -1;
}
// printf("RECV [%d bytes]: '%s'\n", ret, szBuffer);
closesocket(sClient);
WSACleanup();
return 0;
}
int _tmain(int argc, char* argv[])
{
BYTE ss[3] = {0x31,0x32,0x33};
client_operate("127.0.0.1",ss,3);
}
private void Sever()
{
Socket serverSocket;
Thread thread;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5150);
serverSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(ipep);
serverSocket.Listen(10);
while (true)
{
Socket clientSocket = serverSocket.Accept();
thread = new Thread(doWork);
thread.Start(clientSocket);
}
}
private void doWork(object clientSocket)
{
Socket s = (Socket)clientSocket;//客户端信息
IPEndPoint ipEndPoint = (IPEndPoint)s.RemoteEndPoint;
String address = ipEndPoint.Address.ToString();
String port = ipEndPoint.Port.ToString();
Console.WriteLine(address + ":" + port + " 连接过来了");
Byte[] inBuffer = new Byte[1024];
String inBufferStr;
try
{
while (true)
{
s.Receive(inBuffer, 1024, SocketFlags.None);
inBufferStr = Encoding.ASCII.GetString(inBuffer); //实际处理二进制不用这行
// Console.WriteLine(address + ":" + port + "说:");
//这里开线程进行处理即可
MessageBox.Show(inBufferStr);
// Console.WriteLine(inBufferStr); //实际也不用这行
}
}
catch
{
MessageBox.Show("客户端已关闭!","提示");
}
s.Close();
}
功能是很简单,但是当 s.Receive(inBuffer, 1024, SocketFlags.None);执行到这一步的时候不会阻塞, 我用C# 写过客户端 是可以阻塞的,但是C发C#就不行,,求高手~~!
--------------------编程问答-------------------- 试验了一下C# 发 C没有问题,
c 发 C没问题,
c 发 C#有问题,
C# 发 C#没问题
补充:.NET技术 , C#