求一个C\S模式下的SOCKET程序

boost_gao 2008-08-28 10:41:11
主要是实现让客户端向服务器发送文件 能发送成功就行 用来学习研究的哈 谢谢各位了 :)
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvzhenwei 2008-09-10
  • 打赏
  • 举报
回复
是UDP还是TCP的呢
boost_gao 2008-08-29
  • 打赏
  • 举报
回复
恩 分给你了
yyyapple 2008-08-29
  • 打赏
  • 举报
回复
出自http://blog.csdn.net/leonwuyan/archive/2007/09/22/1795849.aspx

C++ C/S Socket连接实例(源码)
#include "stdafx.h"
#include <winsock.h>
#include <iostream>
#pragma comment( lib,"Ws2_32.lib")
#define DEFAULT_PORT 2000
using namespace std;
int Receive(SOCKET fd,char *szText,int len)
{
int cnt, rc;
cnt=len;
while(cnt>0)
{
rc=recv(fd,szText,cnt,0);
if(rc==SOCKET_ERROR)
{
return -1;
}
if(rc==0)
return len-cnt;
szText+=rc;
cnt-=rc;
}
return len;
}

int Send(SOCKET fd,char *szText,int len)
{
int cnt, rc;
cnt=len;
while(cnt>0)
{
rc=send(fd,szText,cnt,0);
if(rc==SOCKET_ERROR)
{
return -1;
}
if(rc==0)
return len-cnt;
szText+=rc;
cnt-=rc;
}
return len;
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(WSAStartup(0x0110,&wsaData)) //调用Windows Sockets DLL
{
printf("Winsock无法初始化!");
return -1;
}
DWORD dwIP = 0;
char szText[MAX_PATH];
memset(szText,0,MAX_PATH);
//把字符串形式的IP地址转成IN_ADDR结构需要的形式。
dwIP = inet_addr("192.168.0.4");
sockaddr_in local;
SOCKET socketTmp;
//必须是AF_INET,表示该socket在Internet域中进行通信
local.sin_family=AF_INET;
//端口号
local.sin_port=htons(DEFAULT_PORT);
//服务器的IP地址。
local.sin_addr.S_un.S_addr=dwIP;
////初始化Socket
socketTmp=socket(AF_INET,SOCK_STREAM,0);
//连接服务器
if(connect(socketTmp,(LPSOCKADDR)&local,sizeof(local)) < 0)
{
closesocket(socketTmp);
printf("连接服务器失败。");
system("pause");
return 0;
}
//发送请求,为简单只发100字节,在服务器端也规定100字节。
while(1)
{
char a[100];
cin >> a;
//if(a == char("exit"))
//{
// closesocket(socketTmp);
// return 0;
//}
Send(socketTmp,a,100);
//读取服务器端返回的数据。
memset(szText,0,MAX_PATH);
//接收服务器端的回应。
Receive(socketTmp,szText,100);
char szMessage[MAX_PATH];
memset(szMessage,0,MAX_PATH);
strcat(szMessage,szText);
//界面上显示回应数据。
puts(szMessage);
}
closesocket(socketTmp);
//system("pause");
}



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

#include "stdafx.h"
#include <winsock.h>
#include <iostream>
#pragma comment( lib,"Ws2_32.lib")
#define DEFAULT_PORT 2000
SOCKET m_Listening;

int Receive(SOCKET fd,char *szText,int len)
{
int cnt, rc;
cnt=len;
while(cnt>0)
{
rc=recv(fd,szText,cnt,0);
if(rc==SOCKET_ERROR)
{
return -1;
}
if(rc==0)
return len-cnt;
szText+=rc;
cnt-=rc;
}
return len;
}

int Send(SOCKET fd,char *szText,int len)
{
int cnt, rc;
cnt=len;
while(cnt>0)
{
rc=send(fd,szText,cnt,0);
if(rc==SOCKET_ERROR)
{
return -1;
}
if(rc==0)
return len-cnt;
szText+=rc;
cnt-=rc;
}
return len;
}
DWORD WINAPI ListenThread(LPVOID lpparam)
{
SOCKET Listening = m_Listening;
//开始监听是否有客户端连接。
if(listen(Listening,40) == SOCKET_ERROR)
{
return 0;
}
char szBuf[MAX_PATH];
//初始化
memset(szBuf,0,MAX_PATH);
while(1)
{
SOCKET ConnectSocket;
sockaddr_in ClientAddr;
int nLen = sizeof(sockaddr);
//阻塞直到有客户端连接,不然多浪费CPU资源。
ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);
//都到客户端的IP地址。
char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
Receive(ConnectSocket,szBuf,100);
//界面上显示请求数据。
strcat(szBuf,"来自(");
strcat(szBuf,pAddrname);
strcat(szBuf,")");
//向客户端发送回应数据
Send(ConnectSocket,szBuf,100);
puts(szBuf);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(WSAStartup(0x0110,&wsaData)) //调用Windows Sockets DLL
{
puts("Winsock无法初始化!");
return -1;
}
DWORD dwThreadID = 0;
sockaddr_in local;
//DWORD dwThreadID = 0;
local.sin_family=AF_INET;
//设置的端口为DEFAULT_PORT。
if(argc>0)
{
local.sin_port = htons(argv[0]);
}
else
{
local.sin_port=htons(DEFAULT_PORT);
}
//local.sin_port=htons(DEFAULT_PORT);
//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
local.sin_addr.S_un.S_addr=INADDR_ANY;//inet_addr("127.0.0.1");
//初始化Socket
m_Listening=socket(AF_INET,SOCK_STREAM,0);
if(m_Listening == INVALID_SOCKET)
{
puts("创建Winsock实例失败!");
return -1;
}
if(bind(m_Listening,(LPSOCKADDR)&local,sizeof(local)) == SOCKET_ERROR )
{
closesocket(m_Listening);
puts("绑定端口失败!");
return -1;
}
//THREAD m_hListenThread;
//m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,&dwThreadID);
if(listen(m_Listening,40) == SOCKET_ERROR)
{
puts("监听端口失败!");
return -1;
}
puts("启动成功");
char szBuf[MAX_PATH];
//初始化
memset(szBuf,0,MAX_PATH);
while(1)
{
SOCKET ConnectSocket;
sockaddr_in ClientAddr;
int nLen = sizeof(sockaddr);
//阻塞直到有客户端连接,不然多浪费CPU资源。
ConnectSocket = accept(m_Listening,(sockaddr*)&ClientAddr,&nLen);
//都到客户端的IP地址。
char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
Receive(ConnectSocket,szBuf,100);
//向客户端发送回应数据
Send(ConnectSocket,szBuf,100);
//界面上显示请求数据。
strcat(szBuf,"\t来自(");
strcat(szBuf,pAddrname);
strcat(szBuf,")");
//closesocket(ConnectSocket);
puts(szBuf);
}
}
boost_gao 2008-08-29
  • 打赏
  • 举报
回复
最好能给个现成的例子哈~
Crob 2008-08-29
  • 打赏
  • 举报
回复
www.codetools.com
www.codeguru.com

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧